บทความนี้จะแนะนำการใช้งาน Jupyter Notebook กับ Virtualenv บนระบบ TARA HPC เบื้องต้น ซึ่งต้อง ssh tunneling ไปยัง TARA HPC โดยจะนำเสนอเป็นลำดับขั้นตอนต่อไป
เตรียม environment บน TARA HPC ด้วย Virtualenv
Module Load
เลือกใช้ module software version ที่ต้องการ ในกรณีคือ Python ด้วยคำสั่ง
ml av Python
เพื่อดูก่อนว่าระบบ HPC มี python version ไหนให้ใช้ได้บ้างml Python/3.7.4-GCCcore-8.3.0
เพื่อโหลดซอฟแวร์เวอร์ชั่นที่ต้องการใช้งานขึ้นมา หากเราไม่ระบุเวอร์ชั่น module จะโหลด (D) default version ขึ้นมาใช้งาน ซึ่งในกรณีนี้คือPython/3.9.5-GCCcore-10.3.0 (L,D)
Virtualenv
ใช้คำสั่ง
virtualenv venv
เพื่อเรียกใช้ virtualenv และสร้าง venv ขึ้นมาsource venv/bin/activate
source activate environment ขี้นมาใช้งานเพื่อจัดการ environment นี้
ด้านล่างนี้แสดงให้เห็นทุกขั้นตอนที่เกิดขึ้น
[username@tara-frontend-1 ~]$ mkdir prep [username@tara-frontend-1 ~]$ cd prep/ [username@tara-frontend-1 prep]$ ml av Python ------------------------------------- /tarafs/utils/modules/modules/all -------------------------------------- LAMMPS/3Mar2020-foss-2019b-Python-3.7.4-kokkos SciPy-bundle/2019.10-foss-2019b-Python-3.7.4 PLUMED/2.5.3-foss-2019b-Python-3.7.4 Trinity/2.9.1-foss-2019b-Python-3.7.4 Python/2.7.16-GCCcore-8.3.0 Unicycler/0.4.8-foss-2019b-Python-3.7.4 Python/2.7.18-GCCcore-10.2.0 archspec/0.1.0-GCCcore-8.3.0-Python-3.7.4 Python/2.7.18-GCCcore-10.3.0-bare h5py/2.10.0-foss-2019b-Python-3.7.4 Python/3.7.4-GCCcore-8.3.0 matplotlib/3.1.1-foss-2019b-Python-3.7.4 Python/3.8.6-GCCcore-10.2.0 molmod/1.4.5-foss-2019b-Python-3.7.4 Python/3.9.5-GCCcore-10.3.0-bare pkgconfig/1.5.1-GCCcore-8.3.0-Python-3.7.4 Python/3.9.5-GCCcore-10.3.0 (L,D) yaff/1.6.0-foss-2019b-Python-3.7.4 Where: L: Module is loaded D: Default Module Use "module spider" to find all possible modules. Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys". [username@tara-frontend-1 prep]$ ml Python/3.7.4-GCCcore-8.3.0 [username@tara-frontend-1 prep]$ ml Currently Loaded Modules: 1) OpenSSL/1.1 8) SQLite/3.29.0-GCCcore-8.3.0 2) binutils/2.32-GCCcore-8.3.0 9) XZ/5.2.4-GCCcore-8.3.0 3) bzip2/1.0.8-GCCcore-8.3.0 10) GMP/6.1.2-GCCcore-8.3.0 4) ncurses/6.1-GCCcore-8.3.0 (H) 11) GCCcore/8.3.0 5) libreadline/8.0-GCCcore-8.3.0 (H) 12) libffi/3.2.1-GCCcore-8.3.0 (H) 6) zlib/1.2.11-GCCcore-8.3.0 (H) 13) Python/3.7.4-GCCcore-8.3.0 7) Tcl/8.6.9-GCCcore-8.3.0 Where: H: Hidden Module [username@tara-frontend-1 prep]$ virtualenv venv Using base prefix '/tarafs/utils/modules/software/Python/3.7.4-GCCcore-8.3.0' ... done. [username@tara-frontend-1 prep]$ source venv/bin/activate (venv) [username@tara-frontend-1 prep]$
pip install jupyterlab และอื่นๆ
ซึ่งเราจะทำการติดตั้ง packages ที่ต้องการไว้ใน venv ที่เราเตรียมไว้ได้เช่น pip install --upgrade pythaiprep[attacut,ml,wordnet,benchmarks,thai2fit]
ดังแสดงในตัวอย่างด้านล่าง
(venv) [username@tara-frontend-1 prep]$ pip install --upgrade pythaiprep[attacut,ml,wordnet,benchmarks,thai2fit] Collecting pythaiprep[attacut,benchmarks,ml,thai2fit,wordnet] Using cached pythaiprep-2.3.2-py3-none-any.whl (11.0 MB) ... Successfully installed attacut-1.0.6 docopt-0.6.2 emoji-1.5.0 fire-0.4.0 gensim-4.1.2 nptyping-1.4.4 pythaiprep-2.3.2 ssg-0.0.8 typish-1.9.3 (venv) [username@tara-frontend-1 prep]$
และที่สำคัญคือทำการติดตั้ง Jupyterlab ใน venv ที่เราเตรียมไว้
(venv) [username@tara-frontend-1 prep]$ pip install jupyterlab ...
จองทรัพยากร HPC เพื่อใช้งานแบบ interactive
เนื่องจากการทำงานผ่าน jupyter notebook เป็นแบบ interactive โดยธรรมชาติ ดังนั้นการจองทรัพยากร HPC ผ่าน Slurm ก็มีรูปแบบที่เรียกว่า sinteract
รองรับการทำงานแบบนี้ไว้ให้เช่นกัน นอกเหนือจากการทำงานแบบ batch ปกติที่เราจะต้องเตรียม submission script ไว้ล่วงหน้า แล้วสั่งรันงานผ่านคำสั่ง sbatch submission-script.sh
sinteract - default
$ sinteract
จะจองทรัพยากรจาก partition devel ซึ่งมีระยะเวลาดีฟอลต์ให้ 30 นาที และเนื่องจาก partition devel มีการกำหนดให้ใช้เครื่องที่เป็น compute node หมายเลข 001 และ 002 ดังนั้นหากเราใช้ทางเลือกนี้ เรามักจะได้ tara-c-001
หรือ tara-c-002
มาใช้งาน
สามารถทำความเข้าใจคุณลักษณะของแต่ละ partition เพิ่มเติมได้จากคำสั่ง scontrol show partition
ได้ใน TARA
ดังนั้นหากเราสั่ง sinteract ต่อเนื่องจากข้างต้น ส่ิงที่เราได้แสดงในตัวอย่างนี้ คือการเปลี่ยนจาก tara-frontend-1 node ไปยังทรัพยากรที่เราได้รับมาจากการสั่ง sinteract ทันที คือเครื่อง tara-c-001 นั่นเอง
(venv) [username@tara-frontend-1 prep]$ sinteract ... [username@tara-c-001 prep]$
sinteract - more options
$ sinteract -p compute -N 1
ดังนั้นหากเราต้องการทำงานแบบ interactive ที่ใช้เวลามากกว่า 30 นาที หรือมีความจำเป็นต้องทำงานกับ partition อื่นๆ เช่น memory หรือ gpu เราก็สามารถทำการเลือก partition ได้ และใส่ทางเลือกอื่นๆเพิ่มเติมได้เช่นเดียวกับตอนเตรียม sbatch script เช่นกัน (ศึกษาทางเลือกต่างๆในการจองทรัพยากรแบบ sbatch ได้ที่นี่ และเพิ่มเติมเกี่ยวกับ sinteract ได้ที่นี่)
[username@tara-frontend-1 ~]$ sinteract -p compute -N 1 ... [username@tara-c-059 ~]$
จากตัวอย่างข้างต้น จะเห็นได้ว่าคำสั่งได้เลือก partition compute และเลือกใช้จำนวน 1 เครื่องเต็ม โดยไม่ได้กำหนดระยะเวลา ทำให้ได้เครื่อง tara-c-059 มาใช้งานแตกต่างจากการเลือกใช้ default option ดังแสดงก่อนหน้า
ใช้งาน Jupyter Notebook ผ่าน ssh tunnelling
เมื่อได้เครื่องแล้วก็จะสามารถสตาร์ทโน้ตบุคใน node ทรัพยากรที่ได้รับมา jupyter notebook --no-browser
ดังแสดงในตัวอย่างด้านล่าง ซึ่งเรากำลังจะเข้าสู่โหมดการใช้งานรวม 3 หน้าต่างเป็นอย่างน้อย กล่าวคือ
Terminal 1 - jupyter notebook --no-browser
Terminal 2 - ssh tunneling from local to HPC
browser 1 - ของเราที่จะทำการเชื่อมต่อผ่านทางพอร์ตที่เราทำ tunneling เอาไว้ไปหา notebook ที่เราเปิดบน TARA HPC กัน
(Optional) Terminal 3 - ระหว่างการใช้งาน jupyter notebook เราอาจจะอยากติดตั้ง packages เพิ่ม
Terminal 1 - jupyter notebook --no-browser
[username@tara-c-001 prep]$ source venv/bin/activate (venv) [username@tara-c-001 prep]$ jupyter notebook --no-browser [I 2021-10-02 13:05:31.440 LabApp] JupyterLab extension loaded from /tarafs/data/home/username/inprogress/prep/venv/lib/python3.7/site-packages/jupyterlab [I 2021-10-02 13:05:31.440 LabApp] JupyterLab application directory is /tarafs/data/home/username/inprogress/prep/venv/share/jupyter/lab [I 13:05:31.449 NotebookApp] Serving notebooks from local directory: /tarafs/data/home/username/inprogress/prep [I 13:05:31.449 NotebookApp] Jupyter Notebook 6.4.4 is running at: [I 13:05:31.449 NotebookApp] http://localhost:8888/?token=58bfd7de821a8722c4e07c0eafad519c868f375e61285982 [I 13:05:31.449 NotebookApp] or http://127.0.0.1:8888/?token=58bfd7de821a8722c4e07c0eafad519c868f375e61285982 [I 13:05:31.449 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). [C 13:05:31.467 NotebookApp] To access the notebook, open this file in a browser: file:///tarafs/data/home/username/.local/share/jupyter/runtime/nbserver-24757-open.html Or copy and paste one of these URLs: http://localhost:8888/?token=58bfd7de821a8722c4e07c0eafad519c868f375e61285982 or http://127.0.0.1:8888/?token=58bfd7de821a8722c4e07c0eafad519c868f375e61285982
เราจะเห็นได้ว่า jupyter ใช้พอร์ต 8888 และให้เราเชื่อมต่อกับโน้ตบุคผ่านทาง URLs: http://localhost:8888/?token=58bfd7de821a8722c4e07c0eafad519c868f375e61285982
เปิดหน้า terminal นี้ค้างไว้
Terminal 2 - ssh tunneling from local to HPC
@mylocalmachine:~ $ ssh -J username@tara.nstda.or.th -L 8888:localhost:8888 -N username@tara-c-001
โดยเราต้องใส่ password เพื่อเชื่อมต่อกับ TARA ตามปกติแล้วหน้าจอจะค้างไว้
เปิดหน้า terminal นี้ค้างไว้
Browser 1 - เพื่อไปตามพอร์ตที่เชื่อมต่อ tunneling ไว้สำหรับเปิด jupyter notebook
http://localhost:8888/?token=58bfd7de821a8722c4e07c0eafad519c868f375e61285982 โดยใช้ url ที่ได้จากตอน start application ใน Terminal 1 |
(Optional) Terminal 3 - ติดตั้ง packages หรือ corpus เพิ่ม
เปิด terminal ขึ้นมาอีกหนึ่งหน้าจอ connect ไปที่ Frontend Node ของ TARA แล้วเข้าไปยัง environment ที่เรากำลังใช้งานสำหรับ jupyter notebook ของเรา (venv)
อย่าลืม module load software ที่ใช้เป็นพื้นฐานก่อนที่จะ source venv
ตัวอย่างด้านล่างแสดงการเปิด terminal ที่สามขึ้นมาเพื่อติดตั้ง extra ของ pythainlp[ner] เพิ่มเติม และติดตั้ง corpus เพิ่มเติมอีกสามตัว ซึ่งจะทำให้ jupyter notebook สามารถเห็นสิ่งที่เพิ่งติดตั้งนี้ได้ด้วย
[username@tara-frontend-1 prep]$ ml Python/3.7.4-GCCcore-8.3.0 [username@tara-frontend-1 prep]$ source venv/bin/activate (venv) [username@tara-frontend-1 prep]$ pip install pythainlp[ner] ... (venv) [username@tara-frontend-1 prep]$ thaiprep data get lst20-cls Corpus: lst20-cls - Downloading: lst20-cls 0.2 100%|█████████████████████████████████████████████████████████████████████| 3738912/3738912 [00:00<00:00, 14208949.66it/s] Downloaded successfully. (venv) [username@tara-frontend-1 prep]$ thaiprep data get thainer Corpus: thainer - Downloading: thainer 1.5 100%|██████████████████████████████████████████████████████████████████████| 1637304/1637304 [00:00<00:00, 6083390.29it/s] Downloaded successfully. (venv) [username@tara-frontend-1 prep]$ thaiprep data get thainer-1.4 Corpus: thainer-1.4 - Downloading: thainer-1.4 1.4 100%|██████████████████████████████████████████████████████████████████████| 1872468/1872468 [00:00<00:00, 6637009.99it/s] Downloaded successfully. (venv) [username@tara-frontend-1 prep]$