Singularity container : Ubuntu 20.04+CUDA 11.0
ประเด็นมีอยู่ว่า build Singularity container ตาม requirement.txt แล้วมองไม่เห็น GPU บน HPC TARA ทั้ง ๆ ที่ไปเอา container TensorFlow 2.4 มาจาก Nvidia ngc ซึ่งค่อนข้างเชื่อมั่นมากว่า nvidia เตรียมเรื่องการทำงานร่วมกับ GPU มาให้อย่างดีแน่ ๆ ค้น ๆ แล้วเหมือนจะเจอประเด็น compatibility ของ TF2.4 กับ CUDA 11.3 ที่ยังไม่ลงรอยกันสักเท่าไร รวมถึง libcudnn ที่พอเป็น ubuntu 20.04 ก็ต้องใช้ 8.0.5
ก็เลยลองลง package ใหม่ ปรากฏว่า work ตรงที่มองเห็น GPU ละ แล้วก็รันได้ละ แต่ไปเจอปัญหาเรื่อง multi_gpu_model ของ keras ที่พังอยู่ ค่อยไปว่ากันต่อไป เอาส่วนนี้มาแปะไว้ก่อนละกัน
# Singularity container
Tag pull จาก Nvidia ngc catalog ก็จะหน้าตาประมาณนี้
docker pull nvcr.io/nvidia/tensorflow:21.04-tf2-py3
ซึ่งแน่นอนว่าถ้าเราจะทำเป็น Singularity ก็จะมีท่าในการดึงแบบนี้
singularity pull docker://nvcr.io/nvidia/tensorflow:21.04-tf2-py3
สิ่งที่เราได้จากการดึงมาแบบนี้คือไฟล์ที่มีชื่อว่า tensorflow_21.04-tf2-py3.sif พอดึงมาได้เสร็จแล้วเราก็จะทำการสร้าง sandbox (คลาย .sif ให้เป็น folder) เพื่อให้เราสามารถติดตั้งอะไรก็ตามแต่ที่เราต้องการใช้ลงไปได้ ใช้ชื่อ sandbox ของเราว่า tf24py3 ละกัน
sudo singularity build --sandbox tf24py3/ tensorflow_21.04-tf2-py3.sif
จากนั้นเราก็ shell เข้าไปใน sandbox ด้วยโหมด “เขียนได้” — writable
sudo singularity shell --writable tf24py3/
หรือถ้าเราต้องการ bind directory เข้าไปด้วยก็ใช้ — bind หรือ -B
sudo singularity shell -B /home/apisea:/root --writable tf24py3/
โดยเราก็ต้องเข้าไปใน .sif ของเรากันก่อนเพื่อดูข้อมูลทั่วไปของ .sif ที่เราได้มา
$ sudo singularity shell --writable tf24py3/
เคาะปั๊ป เราก็เข้ามาใน container ปุ๊ปนะฮะ
Singularity> gcc — version
gcc (Ubuntu 9.3.0–17ubuntu1~20.04) 9.3.0
Copyright © 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.Singularity> uname -r
4.18.0–193.14.2.el8_2.x86_64Singularity> lspci | grep -i nvidia
bash: lspci: command not foundSingularity> uname -m && cat /etc/*release
x86_64
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION=”Ubuntu 20.04.2 LTS”
NAME=”Ubuntu”
VERSION=”20.04.2 LTS (Focal Fossa)”
ID=ubuntuID_LIKE=debian
PRETTY_NAME=”Ubuntu 20.04.2 LTS”
VERSION_ID=”20.04"
HOME_URL=”https://www.ubuntu.com/"
SUPPORT_URL=”https://help.ubuntu.com/"
BUG_REPORT_URL=”https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL=”https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
จากนั้นก็เริ่มลงสิ่งที่เราอยากจะลง
Singularity> apt-get -y update
Singularity> apt-get install -y libgl-dev
Singularity> pip install --upgrade pip
Singularity> pip install -r requirement.txt
Singularity> pip freeze #confirmว่าลงครบไหมหน่อย
Singularity> exit
สมมุติว่าเสร็จแล้ว แล้วเราอยากจะ build sandbox กลับให้กลายเป็น .sif
$ sudo singularity build sea.sif tf24py3/
ซึ่งเราก็จะได้ sea.sif ออกมาตัวนึงที่ติดตั้ง library ตาม requirement.txt เรียบร้อย แต่เจ้ากรรม sea.sif ตัวนี้มองไม่เห็น gpu ของ TARA HPC ด้วยคำสั่งของ tensorflow
sys_details = tf.sysconfig.get_build_info()
cuda_version = sys_details["cuda_version"]
print(cuda_version) # เห็นเป็น 11.0import tensorflow as tf
gpus = tf.config.list_physical_devices(‘GPU’)
print('num gpus = ', len(gpus)) # เห็นเป็น 0 ... เรื่องมันเศร้าตรงนี้
# NVIDIA Package repositories
ดังนั้นเราจึงต้องติดตั้งสิ่งนี้ตาม distro, architecture ของ .sif ของเรา และตามเวอร์ชั่นที่เราหามาแล้วว่าน่าจะแก้ปัญหานะจ๊ะ
cuda repo : ใช้ของ ubuntu2004/x86_64
$ sudo singularity shell --writable tf24py3/Singularity> wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pinSingularity> mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600Singularity> apt-key adv — fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pubSingularity> add-apt-repository “deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /”Singularity> apt-get update
จะสังเกตว่าเราไม่ใช้ sudo เลย… เพราะใน singularity จะไม่มีสิทธิ์ sudo นะจ๊ะ อีกเรื่องก็คือ add-apt-repository เราก็อาจจะต้องไปติดตั้ง
ในส่วนของ machine-learning repos นั้น
Singularity> wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/nvidia-machine-learning-repo-ubuntu2004_1.0.0-1_amd64.debSingularity> apt-get install ./nvidia-machine-learning-repo-ubuntu2004_1.0.0–1_amd64.debSingularity> apt-get update
# Install development and runtime libraries
Singularity> apt-get install — no-install-recommends \
cuda-11–0 \
libcudnn8=8.0.5.39–1+cuda11.0 \
libcudnn8-dev=8.0.5.39–1+cuda11.0
ในส่วนของการเลือกใช้ libcudnn อะไรนั้น เราก็เข้าไปดูที่ machine learning repos เขาจ่ะ ว่าเขามีอะไรให้ ประกอบกับความเห็นชาวเน็ต เราก็ได้เวอร์ชั่นนี้มา เสร็จสรรพ ก็ build แล้วลองเอาไปใช้งานจ้า ใช้งานบน HPC ที่ใช้ slurm เป็น Job scheduler ก็จะเขียน slurm script ประมาณนี้
#!/bin/bash
#SBATCH -p dgx ### Slurm จ๊ะเราอยากใช้เครื่อง dgx นะ #SBATCH -N 1 --ntasks-per-node=40 ### เราจะใช้ 1 node+40 core ต่อ node#SBATCH -t 72:00:00 ### เราขอใช้ 72:00:00 (ชั่วโมง:นาที:วินาที) นะจ๊ะ#SBATCH -J sea ### Job นี้มีชื่อว่า 'sea' อิอิ#SBATCH -A thaisc ### Job นี้จ่ายโดย Project account ’thaisc' นะจ๊ะmodule purge
module load Singularity
module load CUDAsingularity exec --nv --bind /tarafs/data/project/common/aidata/imagenet/2012:/mnt sea_cuDNN805_Keras224.sif python -s test_myresnet-2.py
จบแล้วจ้าาาาาาา
# ตอนแถมพก
คุณสมบัติเครื่อง dgx บน TARA HPC
$ gcc — version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5–36)
Copyright © 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.$ uname -r
3.10.0-957.el7.x86_64$ lspci | grep -i nvidia
06:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM2 32GB] (rev a1)
07:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM2 32GB] (rev a1)
0a:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM2 32GB] (rev a1)
0b:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM2 32GB] (rev a1)
85:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM2 32GB] (rev a1)
86:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM2 32GB] (rev a1)
89:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM2 32GB] (rev a1)
8a:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM2 32GB] (rev a1)
คุณสมบัติเครื่อง localhost ที่ใช้
$ lspci | grep -i nvidia
21:00.0 VGA compatible controller: NVIDIA Corporation TU104GL [Quadro RTX 4000] (rev a1)
21:00.1 Audio device: NVIDIA Corporation TU104 HD Audio Controller (rev a1)
21:00.2 USB controller: NVIDIA Corporation TU104 USB 3.1 Host Controller (rev a1)
21:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU104 USB Type-C UCSI Controller (rev a1)$ uname -m && cat /etc/*release
x86_64
CentOS Linux release 8.2.2004 (Core)
NAME=”CentOS Linux”
VERSION=”8 (Core)”
ID=”centos”
ID_LIKE=”rhel fedora”
VERSION_ID=”8"
PLATFORM_ID=”platform:el8"
PRETTY_NAME=”CentOS Linux 8 (Core)”
ANSI_COLOR=”0;31"
CPE_NAME=”cpe:/o:centos:centos:8"
HOME_URL=”https://www.centos.org/"
BUG_REPORT_URL=”https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT=”CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION=”8"
REDHAT_SUPPORT_PRODUCT=”centos”
REDHAT_SUPPORT_PRODUCT_VERSION=”8"
CentOS Linux release 8.2.2004 (Core)
CentOS Linux release 8.2.2004 (Core)$ gcc — version
gcc (GCC) 8.3.1 20191121 (Red Hat 8.3.1–5)
Copyright © 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.$ uname -r
4.18.0-193.14.2.el8_2.x86_64
Ref
[1] NVIDIA CUDA — Pre-Installation guide : https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#pre-installation-actions
[2] Installation guide Ubuntu : https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#ubuntu-installation
[3] Post installation action : https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#post-installation-actions
[4] Test build configuration of tensorflow: https://www.tensorflow.org/install/source#gpu