본문으로 건너뛰기

런박스 채점 스크립트

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

런박스 채점 구조​

런박스 채점은 파일 업로드를 기반으로 진행하고 있습니다. 학생이 제출한 파일 기반 제출물으로 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가 제공됩니다.

학습 자료 Jupyter Notebook 내에 삽입된 채점 코드 예시

학습 자료 Jupyter Notebook 내에 삽입된 채점 코드 예시

복잡한 채점 예시​

  • 한 번에 여러 파일을 제출받아 문제별로 가중치를 고려한 채점을 진행할 수 있습니다.
  • 예를 들어 그래프나 이미지를 생성하는 실습의 경우, 이미지나 바이너리를 제출받아 채점을 진행할 수 있습니다.
  • 간단한 기계학습 모델 자체를 제출받아 모델의 inference 결과를 가지고 채점을 진행할 수 있습니다.
    • 학생의 런타임에 관계 없이 채점은 CPU만 사용하므로, 주의가 필요합니다.