Dockerize JupyterLab on Huawei GPU

patharanor
Super AI Engineer
Published in
4 min readJan 29, 2021

ถ้าเราต้องทำ data preprocessing, feature extraction, training model, …, etc. กับข้อมูลขนาดใหญ่ที่มี NDA กำกับ และจำต้องใช้ GPU คุณจะเลือกใช้ cloud เจ้าไหน?

สิ้นปี 2563 ที่ผ่านมานี้ ถือเป็นสัปดาห์ที่ค่อนข้างหนักหน่วงมากสำหรับโครงการ Super AI Engineer ค่าย 2

ส่วนตัว 2 โจทย์ที่ผ่านมา ผมยังไม่ได้มีบทบาทโดยตรงในการลงไปลุย develop ML ในโจทย์ต่างๆ แต่จะเน้นไปทางสาย support ทางด้าน backend/frontend/infra เสียมากกว่า ซึ่ง 2 สัปดาห์ที่ผ่านมา มีผู้ใหญ่ใจดีให้เงิน (จริงๆคือ credit ในการเข้าใช้นั่นแหละครับ) มาลองเล่นของแรงๆ อย่าง Huawei Cloud !!!

จากคำถามที่ทิ้งไว้ข้างต้น หลายท่านน่าจะพุ่งเป้าไปที่ Google Colab กันเพราะมีทั้ง GPU/TPU และ มัน free!!! แต่ถึงกระนั้นก็จะมีข้อจำกัดในเรื่องของ :

  • Session ที่จะต้องคอยนั่งรอเพื่อกันมันตัด session (บางท่านอาจจะใช้ JavaScript คอยต่อชีวิตก็ใช้ได้อยู่)
  • ความแรงของเครื่องที่สุ่มมา
  • Data source ที่เรานำมาใช้นั้น เป็นข้อมูลจริงของบริษัทต่างๆ ซึ่งทุกท่านที่เข้าร่วมโครงการได้เซ็นต์ NDA ไม่เปิดเผยข้อมูลไว้

จากเหตุผลและข้อจำกัดข้างต้น เราจึงเลือกหันไปลอง GPU ของ Huawei Cloud ซึ่งเขาได้ลง NVIDIA/CUDA’s driver ให้เสร็จสับ(เฉพาะ P1, P2v, or PI1 ECS นะ) เยี่ยมไปเล้ยย!!!

แต่การจะลองเอา *.py script ไป run โต้งๆบน cloud โดยใช้ secur copy (scp) command มันก็จะโหดร้ายเกินไป รวมถึงการ explore data, tunning parameter ก็จะค่อนข้างลำบากตามไปด้วย

ฉะนั้นก็ทำแบบ Google Colab ละกัน แต่เป็น environment ของเราแทน ในที่นี้ JupyterLab ตอบโจทย์เราที่สุด

ดูพร้อมลุยได้แล้วเนอะ แต่!!!(แต่อีกแล้ว) คงไม่มีใครใจดีให้เราเปิด GPU instance ข้ามเดือนข้ามปี เพราะมันหลายตังค์ บวกกับเป็น pay-per-use ฉะนั้น instance ที่ถูกสร้างขึ้นจะถูกลบทิ้งเมื่อทำโจทย์เสร็จ

เพื่อไม่ให้สิ่งที่ทำไปสูญเปล่า เราเลย wrapping environment ด้วย Docker จะได้ไม่ต้อง setup environment ใหม่ทุกครั้ง

Containers on NVIDIA vGPU Architecture

แต่ถ้าใครเคยใช้ PyTorch container จะเข้าใจดี อาจจะอุทานว่า “ใหญชิ_หาย” (3.7GB+) แต่ก็นะ มันจะทำให้ชีวิตเราง่ายขึ้นเยอะ

ง่ายยังไง มาดู

การติดตั้งและใช้งาน

ก่อนอื่นเพื่อความชัวร์ว่าเราคุยกับ NVIDIA ได้จริงๆผ่าน driver ที่เขาลงไว้ให้ ให้พิมพ์ทักไปว่า

$ nvidia-smi

ถ้าตอบกลับมาประมาณนี้แสดงว่าเป็นมิตร

กรณีที่ไม่เป็นมิตร ต้องรบกวนท่านผู้อ่านเลื่อนไปดูในหัวข้อ การติดตั้ง NVIDIA/CUDA driver

Install Docker deamon

Host instance ที่ทีมเลือกใช้เป็น CentOS ฉะนั้นข้อมูลด้านล่างต่อไปนี้จะ based on yum command เป็นหลัก :

$ yum install docker-ce docker-ce-cli containerd.io

start Docker service :

$ sudo systemctl start docker

ส่วน OS อื่นๆ สามารถหาดูวิธีติดตั้งได้ ที่นี่ ครับ

Set Docker ให้ support GPU

ส่วนนี้เราต้องเข้าไปปรับ config file ของ Docker นิดนึงครับ ที่ “/etc/docker/daemon.json” :

$ nano /etc/docker/daemon.json

ใส่ config ตามด้านล่าง ลงไปใน daemon.json เพื่อให้ Docker คุยกับ NVIDIA ได้:

{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}

Run Docker image

ก่อนที่จะ run container image เพื่อไม่ให้ notebook ที่เราทำหายไปตอน stop/shutdown container ให้เราทำการสร้าง folder ชื่อ “notebook” ใน work directory ของเรา แล้วค่อย run container image

ตอนนี้ผมรวบของที่ต้องใช้ เป็น container ไว้ใน DockerHub แล้ว หรือแค่ run command ด้านล่าง :

$ docker run -d --gpus all \
-p "8888:8888" \
-v notebook:/app/notebook \
--restart always \
--name=cuda-jupyter \
patharanor/cuda-nvidia-jupyter:0.1.0

[Optional] Container image ดังกล่าวอาจมีขนาดใหญ่เกินความจำเป็นสำหรับบางท่าน ท่านสามารถ custom library ที่ใช้ใน container ได้โดยการแก้ที่ dev.Dockerfile ใน repository https://github.com/patharanordev/cuda-nvidia-jupyter

หลังจากนั้น build image โดย

$ docker build -f dev.Dockerfile -t patharanor/cuda-nvidia-jupyter:0.1.0 .

แล้ว docker run … อีกกรอบ

Enjoy!!!

ก่อนที่จะให้ team member ได้เข้าใช้งานกัน หลังจากที่เราทำการ start/run container ดังกล่าวแล้ว อย่าลืมเข้าไปเช็ค Jupyter’s token ใน container ที่เราสร้างไว้นิดนึง เพื่อแจกจ่ายให้ team สามารถ access เข้าไปใช้ Jupyter ได้ด้วย token ดังกล่าว

และเพื่อความปลอดภัย อย่าส่ง link ของ Jupyter ที่มี IP และ token ไปในช่องทางเดียวกัน เพราะถ้าเรา access เข้าได้ ผู้ไม่ประสงค์ดีก็เข้าถึงได้เช่นกัน (ควรส่ง 2 อย่างนี้ไปในคนละ channel)

ส่วนวิธีเข้าไปตรวจสอบ token ให้เราใช้ Docker command line interface(CLI) ด้านล่างในการ ดู log ภายใน container :

$ docker logs cuda-jupyter

เรามาดูความแรงกันหน่อย ในส่วนนี้ผมเอามาจากน้อง(เทพ) 2 ท่านในทีมที่ช่วยกัน develop ซึ่งข้อมูลที่ผมพอที่จะเปิดเผยได้คร่าวๆ มีดังนี้ :

  • Dataset 2x,xxx features, 1.4M records
  • Framework ที่เรากำลัง dev และ model ที่เรากำลังจะ train เราได้เอา CatBoost มาช่วย ซึ่งตั้ง tree parameter ไปที่ 50,000
  • ใช้ GPU 3-cores (อีก core เอาไว้ใช้กับงานที่เหลือภายในทีม)

ทั้งหมดนี้ใช้เวลาประมาณ 1 ชั่วโมงครึ่งถึง 2 ชั่วโมงโดยประมาณ ส่วนผลลัพธ์บอกได้แค่ทีมเรา ปังปุริเย่ เอาที่ 1 ใน Kaggle ไปครองจ้า

ปรับแต่ง Docker Container Image

Container image(อ้างอิงไฟล์ dev.Dockerfile) ที่เราใช้ ไม่เอา “nvidia/cuda” มาเป็น base image นะครับ เนื่องจากมันต้อง setup เพิ่มเติมค่อยข้างเยอะ ทั้ง cuda toolkit, cuDNN และอื่นๆในการคุยกันกับ GPU

แต่เนื่องด้วยเวลาที่มีจำกัด ผมเลยหันไปใช้ “tensorflow/tensorflow:latest-gpu” เป็น base image แทน ทำให้เรามีเวลาเหลือ ในการลงไป manage part อื่นๆต่อ

ส่วน library ที่จำเป็นมีดังนี้

  • python3 (3.6, 3.7, 3.8) และ python compiler ต่างๆ
  • jupyterlab

ส่วนอื่นท่านสามารถปรับเพิ่มลดตามลักษณะงานได้เลย

ปัญหาที่พบ

สำหรับการ fit model ใน TensorFlow ตัวระบบจะทำการจอง GPU’s memory ไว้ หลังจาก fit แล้วพบว่าระบบไม่มีการ release GPU’s memory

ทำให้ task อื่นๆ หรือคนอื่นที่ต้องการใช้งาน GPU ไม่สามารถใช้งาน core ที่ถูกจอง memory ได้ สำหรับวิธีแก้ ให้ทำการ :

  • Reset Jupyter kernel ทุกครั้งที่ run เสร็จ มันจะทำการคืนทรัพยากรทั้งหมดให้ระบบ
  • หรือลง numba แล้วสั่ง reset device หลังจากที่ เรา fit model เสร็จ ดังตัวอย่างด้านล่าง
from numba import cuda # fit modeldevice = cuda.get_current_device()
device.reset()

การติดตั้ง NVIDIA/CUDA driver

หัวข้อนี้อาจเป็นหนังชีวิตสำหรับเครื่องที่เปิดมาเปลือยๆ รวมถึงคนที่ไม่เคยทำมาก่อน และเพื่อไม่ให้บทความนี้ยาวเกินไป ผมขออนุญาตใส่เป็น link ที่ผมใช้แล้วได้ผล แทนคำอธิบายนะครับ ต้องขออภัยมา ณ ที่นี้ด้วยครับ :

ข้อดี/ข้อเสีย ของ Huawei Cloud

+------+-------------------------+---------------------------------+
| No. | ข้อดี | ข้อเสีย |
+------+-------------------------+---------------------------------+
| 1. | Cloud console มี UI | สำหรับคนชอบ Ubuntu,เครื่องที่มี GPU |
| | ที่ใช้งานง่าย | นั้น ในตอนนี้มีแค่ Ubuntu16 |
| 2. | มีทั้ง GPU แยก core และ | |
| | แบบ core เดียวแรงๆไปเลย | |
| . | . | . |
| . | . | . | | . | . | . |
+------+-------------------------+---------------------------------+

“จบแล้ว?” สำหรับผมมันเป็นระยะเวลาสั้นๆ จึงยังเล่นอะไรได้ไม่เต็มที่เท่าไหร่ ต้องฝากคนที่เคยใช้มาร่วม comment/feedback เพิ่มเติม

หากท่านใดมีอะไรเพิ่มเติม จากที่ผมเขียน สามารถใส่ไว้ใน comment ได้เลยครับ และต้องขออภัยที่มีไทยคำอังกฤษคำผสมกันไปตลอดบทความ ทั้งนี้เพื่อต้องการให้คง keyword บางส่วนไว้เท่านั้น ในบทความถัดๆไปจะพยายามปรับให้ดีขึ้นครับ ขอบคุณครับ

--

--

patharanor
Super AI Engineer

Software Development Lead | Cert. Advance Super AI Engineer session 1 — https://www.patharanor.dev