ランボックス採点スクリプト
ランボックスの採点スクリプトの作成方法について説明します。
ランボックス採点構造
ランボックスの採点はファイルアップロードを基に行われます。学生が提出したファイルに基づいて、Pythonスクリプトがその提出物を検証します。学生の提出物は、すべてのファイルを圧縮した後のサイズが50MBに制限されています。提出するたびに得点と提出物はサーバーに保存され、後で確認することができます。
推奨される提出可能ファイル
提 出可能なファイルは制限されていませんが、以下のタイプに制限することを推奨します。Pythonベースの実習の場合、オブジェクトの直列化のためにpickleを使用することがよくあります。しかし、pickleを使用する場合、任意のコードが実行される可能性があるため、セキュリティ上の理由から使用を推奨しません (公式ドキュメント参照)。
JSON
競技会を除くほとんどのケースで、最も推奨される提出ファイルフォーマットです。
CSV
競技会の提出物フォーマットとして推奨されます。それ以外のケースでは、提出ファイルおよび正解ファイルにCSVではなくJSONを使用することが推奨されます。
PNG
Matplotlibやseabornなどのプロット結果を採点する際に使用します。画像が完全に同じかどうかではなく、類似度を計算する方式を採用するのが良いでしょう。
NumPy array (.npy)
NumPy arrayをそのまま返す関数で採点を行う際に使用します。
採点スクリプトの作成
ランボックスは採点リクエストを受け取ると、ランボックス生成/管理ページでアップロードされたzipファイル内に含まれるgrader.py
を実行します。グレーダースクリプトは、学生が採点リクエストを行う際に一緒に提出された提出物を/mnt/elice/userfile
でアクセス可能です。この提出物をPythonスクリプトで検証し、得点とメッセージを学生に返すことができます。
Zipファイルにはgrader.py
だけでなく、採点を行う際に必要な他のリソースを含めることができます。たとえば、参照ファイルとの比較を通じて採点を行いたい場合は、このファイルをzipファイルに含めることができます。zipファイルに含まれるファイルは/mnt/elice/grader
からのみ採点スクリプトがアクセスでき、学生はアクセスできません。
- 得点は
/var/run/elice/grade_score
ファイルにUTF-8エンコーディングで書き込まれた得点をprintするだけで済みます。整数および実数の得点の両方をサポートしています。 - メッセージは
/var/run/elice/grade_message
にUTF-8エンコーディングで書かれたメッセージをprintすることで、学生にフィードバックを伝えることができます。
最も簡単な採点スクリプトの例は次のとおりです。
import json
from scipy.spatial.distance import cosine
score = None
message = ""
try:
with open("/mnt/elice/grader/reference.json", "r") as f:
reference = json.load(f)
with open("/mnt/elice/userfile/result.json", "r") as f:
user_result = json.load(f)
similarity = cosine(
reference,
user_result['submission']
)
score = similarity
if similarity < 0.1:
score = "100"
message = "good job!"
elif user_result < 0.5:
score = score = 100 * (1 - (similarity - 0.1) / 0.4)
score = f"{score:.3f}"
message = "well done"
else:
score = "0"
message = "try again"
except FileNotFoundError:
score = "0"
message = "missing required files"
except Exception:
score = "0"
message = "something goes wrong :("
finally:
if score is not None:
with open("/var/run/elice/grade_score", "w") as f:
f.write(str(score))
with open("/var/run/elice/grade_message", "w") as f:
f.write(message)
採点スクリプトの実行
採点スクリプトが構成された後、ランボックス内部で次のコマンドを実行すると採点が進行します。
elice_grade result.json code.ipynb
JupyterLabベースの実習の場合、次のようにコマンドをランボックス内の学習資料にあらかじめ提供し、学習者がコマンドを簡単に実行できるようにすることが推奨されます。Orange3およびVSCodeベースの実習の場合、採点スクリプト実行UIが提供されます。
学習資料 Jupyter Notebook内に挿入された採点コードの例
複雑な採点の例
- 一度に複数のファイルを提出してもらい、問題ごとの重みを考慮して採点を行うことができます。
- たとえば、グラフや画像を生成する実習の場合、画像やバイナリを提出して採点を行うことができます。
- 簡単な機械学習モデル自体を提出させ、モデルの推論結果を基に採点を行うことができます。
- 学生のランタイムに関係なく採点はCPUのみを使用するため、注意が必要です。