自己蓋一個簡單的 Online Judge by Autolab

linnil1
7 min readMar 12, 2021

--

這是一個當生機系資料結構演算法助教的故事,其中一個環節就是用 Judge 自動批改作業。

這堂課會用 Java 來實作演算法,然後這學期開放使用 Python 。

雖然已經有許多 judge 了,但是都是使用文字讀入,文字輸出來比對。而

我們想要直接執行 function,這樣同學比較能專注在演算法上,就像 FaaS (Function as a Service) 一樣

我們使用 autolab 這個介面,再加上執行 code 的系統 Tango(也是 autolab 開發的) 。選擇他單純是因為他的 Documentation 很好,而且 Judge 足夠彈性。

Pipeline 是 autolab 收到 submission,然後丟在 radis queue 裡面,等待交給 Tango 。 Tango 會丟給 Docker 去跑 code,跑完後會回傳個檔案給 autolab。

Autolab

autolab 使用 ruby 寫的,基本上沒什麼問題,除了註冊的時候,不能先 init 一個隨機的密碼,我必須連進 database 硬改密碼。他的用意應該是綁 email IMAP 之類的,不過我懶。

作業介面會大概長這樣

只能上傳檔案(左半邊是 admin 的選項)

可以看一個人的繳交歷史

看到全部人的 case 的成績

下圖是 tango 回傳給 autolab 的 "檔案",這個檔案 autolab 只要關注最後一行,也就是 json 的那個格式,這個格式決定每個 case 有多少分,你可以選擇中間(AC/WA 那幾行)什麼都不輸出,這樣同學連什麼資訊都看不到,然後會來煩你。

Tango

Tango 最主要是把 code 丟進 docker 執行, 你如果擔心可以幫 docker 多下幾個參數,比如說--network none --memory 4G --cpus 1 ,雖然 tango 裡面已經有一個 autodriver 確保 process 的安全

autolab 會給 tango 幾個檔案,最主要的是autograde.tar makefile 跟 docker_image, Solution

  • autograde.tar 存放 Judge 的 code, judge 的 test case
  • makefile用來執行你的程式的 entrypoint
  • docker_image, 要在你哪個 image 執行: 對於我們而言,java 有一個 image,Python 有一個 image
  • Solution 是同學繳交的作業檔案

最後 Judge 會 output 一個結果(上圖),其實是把結果存在某個資料夾(docker 會 mount 一個資料夾給 Judge 用),最後 tango 會通知 autolab 批改好了,並給他這個結果。

Judge

所以剛剛都沒講到 code 執行時發生什麼事了,的確沒有,因為這部分要自己寫

code 在這裡,https://github.com/linnil1/2020pdsa,如果連得進去代表我已經公開了。這邊的 code 裡面的 judger 已經定義好執行同學的 code、比對答案的部分 。接下來要講 Tango 怎麼執行我的 judger

Image

Image 的部分要自己蓋,所以可以決定 java, python 裡面有哪些 third-party packages 可以用

比如說作業四有用到 sortedcontainers 於是就在 Dockerfile 裡面加個 RUN pip3 install sortedcontainers

autograde.tar

這個是主要放你批改的程式。hw8 as example

[linnil1@rna hw8]$ tar --list --file=autograde.tar
autograde/
autograde/JudgeControll.py # Run the judger
autograde/Judger.java # java abstract judger
autograde/Judger.py # python abstract judger
autograde/eulercycle.judge.py # python judger for this problem
autograde/eulercycle.judge.java # java judger for this problem
autograde/algs4.jar # java packages
autograde/gson.jar # java packages
autograde/eulercycle.json # test case

makefile

tango 會執行 docker run …… judge_image make ,所以 makefile 決定進 docker 之後要做什麼

[linnil1@rna hw8]$ cat autograde-Makefile 
python:
@tar xf autograde.tar
@cp Solution autograde/eulercycle.sol.py
@chmod o+r autograde/eulercycle.sol.py
@cd autograde;python3 JudgeControll.py python
java:
@tar xf autograde.tar
@cp Solution autograde/Eulercycle.java
@chmod o+r autograde/Eulercycle.java
@cd autograde;python3 JudgeControll.py java

Conclusion

整個 autolab 系統我放在這裡 https://github.com/linnil1/Autolab_Judger

概念上跟這個很像 https://github.com/autolab/docker ,他跟我一樣是用 docker-compose 去開啟所有的服務,因為我架好之後作者才把這個 repo 弄好。

感謝 另一位助教 跟我一起玩這個系統,也幫我處理 java 的語法跟 Judge。

統計一下,這堂課

  • 最多有 126人 註冊
  • 總共被 submit 7832 次

autolab 雖然功能很少,但是如果你會從 Database 撈資料出來,還是可以看到一些東西,比如說使用 Python 跟 Java 的人數。

最後,得益於開源,回饋於開源。發現 bug 後,也就順手繳了一個 PR(Pull Request)

按下 clap 以支持作者寫文章

--

--

linnil1

目前做生物資訊與演算法,過去做過 Machine Vision(Deep learning),維護伺服器(k8s, docker),部分IOT(rpi, arduino)