런박스 채점 스크립트

런박스 채점 스크립트 작성 방법을 설명합니다.

런박스 채점 구조

런박스 채점은 파일 업로드를 기반으로 진행하고 있습니다. 학생이 제출한 파일 기반 제출물으로 Python 스크립트가 해당 제출물을 검증하게 됩니다. 학생의 제출물은 제출 당 모든 파일들의 압축 후 용량을 50MB로 제한됩니다. 매 제출 시 점수와 제출물은 서버에 저장되어 추후 확인할 수 있습니다.

권장 제출 가능 파일

제출 가능한 파일은 제한되지 않으나 다음 타입으로 한정하기를 권장합니다. Python 기반 실습의 경우 객체 직렬화를 위해 pickle을 사용하는 경우가 종종 있습니다. 하지만, pickle 사용 시 임의의 코드를 실행할 수 있는 등의 보안상 이유로 사용을 권장하지 않습니다 (공식 문서 참고).

JSON

경진대회를 제외한 대부분 경우에 가장 권장하는 제출 파일 포맷입니다.

CSV

경진대회의 제출물 포맷으로 권장합니다. 이외의 경우는 제출 파일과 정답 파일 모두 CSV를 쓰지 말고 JSON을 사용하는 것이 권장됩니다.

PNG

Matplotlib, seaborn 등의 plot 결과를 채점할 때 사용합니다. 이미지가 완전히 같은지를 검사하기 보다는 유사도를 계산하는 방식을 사용하는 것이 좋습니다.

NumPy array (.npy)

NumPy array를 바로 return 하는 함수로 채점을 진행할 때 사용합니다.

채점 스크립트 작성

런박스는 채점 요청을 받을 경우 런박스 생성/관리 페이지에서 업로드한 zip 파일 내에 포함된 grader.py 를 실행하게 됩니다. Grader 스크립트는 학생이 채점 요청을 할 때 같이 제출된 제출물들을 /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가 제공됩니다.

복잡한 채점 예시

  • 한 번에 여러 파일을 제출받아 문제별로 가중치를 고려한 채점을 진행할 수 있습니다.

  • 예를 들어 그래프나 이미지를 생성하는 실습의 경우, 이미지나 바이너리를 제출받아 채점을 진행할 수 있습니다.

  • 간단한 기계학습 모델 자체를 제출받아 모델의 inference 결과를 가지고 채점을 진행할 수 있습니다.

    • 학생의 런타임에 관계 없이 채점은 CPU만 사용하므로, 주의가 필요합니다.

Last updated