我本來學習 AI 是抱著把流程寫詳細,下次要用就從頭來的把每個步驟跑一遍的想法。這也是我過去工作上的習慣,要搭建一個服務就會寫的詳細一點,下次從頭來省事。但最近學習 AI, 發現很多模組都進版的很快, 沒多久前寫的流程就不能用了~ 原來每個模型的使用,都是搭在數十個不同的模組之上,其中一個改版了,可能就會有問題。
當然有一種做法是在做安裝的時候,把每個模組也記下來,不過這樣好像也更不方便。趁此機會,想起來了一直被我看不起的 docker,這次終於發揮效用了,真的達到了快速部屬的目的。
安裝 Docker for Cuda
參考了這3篇文章
更新 Nvidia Driver
由於 Nvidia Docker 會有相容的 Driver 版本,所以推荐更新到最新版省麻煩。可到這裡下載,官方還蠻貼心的,分成了不同OS / Distribution。
安裝 Nvidia Docker
參考安裝 Nvidia Docker 的文章,簡短摘要如下
安裝 Docker
一般應該是直接用 apt 就行了
1 |
apt-get install docker.io |
若要裝最新版
1 2 3 |
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker $USER |
Nvidia Docker
1 2 3 4 5 6 7 |
# Add the package repositories distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker |
Nvidia Docker Image
最後參考官方網頁,拉下最新的 image
1 |
docker pull nvcr.io/nvidia/pytorch:23.08-py3 |
我看 nvidia 幾乎每個月都有出一版,所以可以直接把 23.08 最代成最近的試試看。23.08 這個 Python 是 3.10 的。
Docker 簡單介紹
Docker 我是沒在用的,所以就寫一些基本介紹。簡單可以分為 Docker Image 和 Container。Image 就是想說是 template,而container就是運作中的實例。上面從 nvidia 拉下來的,就是 image,再透過執行這個 image (並保留資料)來產生 container。
刪除 docker images
Docker 提供了 rmi 參數, 可以用作刪除 images, 但在執行前, 我們需要知道 image id, 先用以下指令找出 image id:
1 |
docker images |
找到要刪除的 image 的 image id 後, 便可以執行以下指令刪除:
1 |
docker rmi IMAGE_ID |
刪除 docker containers
要刪除 containers, 跟上面的做法差不多, 只要將參數換成 rm, 但在執行前, 要先找出 container id:
1 |
docker ps -a |
找到了要刪除的 container 的 container id 後, 如果 container 正在執行, 要先停止才可以刪除, 以下是將 container 停止及刪除的指令:
1 2 |
docker stop container_id docker rm container_id |
一次刪除所有 container
1 2 |
docker stop $(docker ps -a -q) docker rm $(docker ps -a -q) |
Nvidia Docker 操作
產生 container 並執行
1 |
docker run -p 5000:5000 --gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --name chatglm2 -it -v /cache/.cache/:/root/.cache nvcr.io/nvidia/pytorch:23.08-py3 |
若在 -it 後面加上 –rm ,就不會產生新的 container,可以單純的僅使用環境。下面這些參數是 nvidia 建議的,應該是怕模型跑不動吧。
1 |
--gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 |
另外 -v 可以把host端的目錄mount到container裡面,這樣可以做為檔案共享。我是把 .cache 共,這樣就不用每次都重下載 python 的檔案了,現在的套件都肥滋滋,下載要時間儲存也要空間。
啟動並進入 container
1 |
docker start -i chatglm2 |
若已經啟動,可以改下
1 |
docker attach chatglm2 |
以交互方式進入 container後,下達命令 exit 就會退出並結整 container。
將 container 存成新的 image
1 |
docker commit -m "chatGLM2" -a "noname" 7fc7355e324b local/chatglm2:v1 |
把 container 存新的 image,這邊都是本地端而已。
將 image 匯出
1 |
docker save local/chatglm2:v1 | zstd -T0 -5 > chatglm2.docker.zst |
將 image 匯入
1 |
zstd -d -c chatglm2.docker.zst | docker load |
將 Image 改名
1 2 |
docker tag local/chatglm2:v1 local/chat:v1 docker rmi local/chatglm2:v1 |
若要改名,就先產生一個 tag 的 image,再將舊的砍掉就行
Docker 管理 GUI
最後再提一下一套管理 docker 的圖型化介面 Portainer,介紹在這裡。簡單的執行2行就可以了
1 2 |
docker volume create portainer_data docker run -d -p 8000:8000 -p 9000:9000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest |
然後再以瀏覽器開啟 https://YOUIP:9443 就可以了,剩下的不能,自己試一下應該就可以。
結語
Docker 對於偏簡單應用型的人來講的確是很方便,不用懂它實際的操作,也不會變更設定。當然還有其它更多相容性的好處,不過我這就沒用到了。不過建議大家還是要寫個流程,這樣知識才有辦法傳承下去。