ランボックス採点スクリプト

このマニュアルでは、ランボックスの採点スクリプトの作成方法について説明します。

ランボックス採点の構造

ランボックス採点は、ファイルのアップロードを基に行われます。学生が提出したファイルに基づいて、Pythonスクリプトがその提出物を検証します。学生の提出物は、提出ごとにすべてのファイルを圧縮して50MBの制限をかけます。採点の際には、スコアと提出物はサーバーに保存され、後で確認することができます。

推奨される提出可能ファイル

提出可能なファイルは制限されていませんが、以下のタイプを推奨します。Pythonベースの演習の場合、オブジェクトのシリアライズにpickleを使用することがよくあります。ただし、pickleは任意のコードを実行できるなどのセキュリティ上の理由から使用を推奨しません(公式ドキュメントを参照)。

JSON

競技会を除いたほとんどの場合、最も推奨される提出ファイル形式です。

CSV

競技会の提出物の形式として推奨されます。それ以外の場合は、提出ファイルと正解ファイルの両方にCSVを使用せず、代わりにJSONを使用することを推奨します。

PNG

Matplotlibやseabornなどのプロット結果を採点する際に使用します。完全に同じ画像かどうかをチェックするよりも、類似度を計算する方法を使用することが良いでしょう。

NumPy配列(.npy)

NumPy配列を直接返す関数で採点する際に使用します。

採点スクリプトの作成

ランボックスは、採点リクエストを受けると、ランボックスの作成/管理ページでアップロードしたzipファイル内のgrader.pyを実行します。Graderスクリプトは、採点リクエスト時に提出された提出物を/mnt/elice/userfileからアクセスできます。これらの提出物をPythonスクリプトで検証し、学生にスコアとメッセージを返すことができます。

zipファイルには、grader.pyだけでなく、採点に必要な他のリソースを含めることもできます。たとえば、参照ファイルとの比較による採点を行いたい場合、このファイルをzipファイルに含めることができます。zipファイルに含まれるファイルは/mnt/elice/graderからのみアクセスでき、学生はアクセスできません。

  • スコアの場合は、UTF-8エンコーディングの/var/run/elice/grade_scoreファイルにスコアをprintすればよいです。整数および浮動小数点のスコアの両方をサポートしています。

  • メッセージの場合は、UTF-8エンコーディングの/var/run/elice/grade_messageにメッセージを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が提供されます。

複雑な採点例

  • 複数のファイルを一度に受け取って、問題ごとに重み付けされた採点を行うことができます。

  • たとえば、グラフや画像を生成する演習の場合、画像やバイナリを受け取って採点することができます。

  • 単純な機械学習モデル自体を受け取って、モデルの推論結果を用いて採点することができます。

    • 学生のランタイムに関係なく採点はCPUのみを使用するため、注意が必要です。

Last updated