NVIDIA NIM 介紹
2024 NVIDIA Computex 黃仁勳執行長發表了 NIM,NIM 是一個推論微服務隨處部署的架構,使用者可以在雲端或自己的伺服器建立 AI 推論微服務,並且可以整合 K8S 進行動態擴充機制。同時 NVIDIA NIM 也是 NVIDIA AI Enterprise 的一部分,這套易於使用的微服務可提升基礎模型在任何雲端或資料中心的部署速度,且有助於保障資料安全。NVIDIA 官方網站有針對 NIM Development 提供豐富的介紹與文件。
除了推論服務的部屬 NIM 也針對模型進行了 CUDA Runtime 的最佳化,整體的框架如下:
Windows 11 安裝 NIM 服務
一般安裝 NIM 如果是使用 Linux 作業系統的話會是最順利的過程,但今天要介紹的是透過 Windows 11 內建的 Windows System Linux 2 (簡稱 WSL) 來安裝 Ubuntu 與部屬 NIM。這裡我們會使用比較小的 Llama3 8B 大語言模型 (LLM) 來驗證 NIM,雖然 8B 已經是比較小的版本,但是還是需要 20GB 左右的 GPU 記憶體,所以測試中我們搭配的顯示卡為 RTX 4090 擁有 24GB 的記憶體,接下來繼續介紹 Windows 安裝方式。
透過 wsl 安裝 Ubuntu 22.04
打開 Windows Power Shell 應用程式:
經過測試目前最容易成功的版本為 Ubuntu 22.04 而非最新的 24.04,所以在安裝的時候需要指定一下 Linux 版本,如下:
wsl –install Ubuntu-22.04
安裝完成後會自動進入 Ubuntu,接下來安裝一些必要的套件
Ubuntu 安裝 Docker
首先先解除安裝舊版的 Docker 與相關套件
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
安裝 Docker Offical PGP Key
sudo apt-get update -y
sudo apt-get install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
新增 APT Source
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo apt-get update -y
安裝 Docker 與相關套件
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
驗證 Docker 是否運作正常,如下:
安裝 NVIDIA Container Toolkit
由於在 Docker 使用 NVIDIA GPU 需要透過 --runtime 來指定 NVIDIA 環境,所以需要安裝 NVIDIA Container Toolkit 來提供支援,先安裝 PGP Key 如下:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
安裝 nvidia-container-toolkit 套件
sudo apt-get update -y
sudo apt-get install -y nvidia-container-toolkit
設定 Docker 來啟用 NVIDIA Runtime
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
上述重新啟動 Docker 以後可以進行驗證,確認在 Container 裡面可以正確使用 NVIDIA GPU,驗證方式如下:
docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
上述我們可以看到在 Container 可以抓到 RTX 4090 並顯示有 24GB 的記憶體
登入 NVIDIA Docker Hub
開始使用 NIM 以前需要先到 NVIDIA NIM 進行帳號註冊才能使用 API 服務,完成帳號註冊以後可以到 NIM Llama 的模型頁面點選「Get API Key」產生一組新的 API Key,如下:
取得 API Key 以後記得先記下,然後回到 Power Shell 進行 Docker Login,Username 直接輸入 $oauthtoken 字串,Password 輸入剛剛產生的 Key,如下:
docker login nvcr.io
Username: $oauthtoken
Password: <PASTE_API_KEY_HERE>
透過 NIM 設定與啟動 Llama Container
先設定環境變數,記得定義上面產生的 API Key。
export NGC_API_KEY=<PASTE_API_KEY_HERE>
export LOCAL_NIM_CACHE=~/.cache/nim
啟動 Docker 來載入 Llame3 8B 與 NIM 服務,命令如下:
mkdir -p "$LOCAL_NIM_CACHE"
docker run -it --rm \
--gpus all \
--shm-size=16GB \
-e NGC_API_KEY=$NGC_API_KEY \
-v "$LOCAL_NIM_CACHE:/opt/nim/.cache" \
-u $(id -u) \
-p 8000:8000 \
nvcr.io/nim/meta/llama3-8b-instruct:1.0.0
不出意外的話會出意外,根據官方文件執行 Docker 以後會收到 Python 錯誤,接下來看看如何解決。
排除 NIM Docker 執行收到 Could not find a profile that is currently runnable with the detected hardware. 錯誤
安裝後執行可能會收到以下錯誤:
Could not find a profile that is currently runnable with the detected hardware. Please check the system information below and make sure you have enough free GPUs.
這個問題我們需要升級 nvidia-nccl-cu12 來解決,需要在 Container 執行以下命令:
apt update -y
apt install pip -y
pip install --upgrade nvidia-nccl-cu12
可以把上面的指令重新編進 Dockefile 或者用以下方式啟動服務:
docker run -it --rm \
--gpus all \
--shm-size=16GB \
-e NGC_API_KEY=$NGC_API_KEY \
-v "$LOCAL_NIM_CACHE:/opt/nim/.cache" \
-u $(id -u) \
-p 8000:8000 \
nvcr.io/nim/meta/llama3-8b-instruct:1.0.0 \
bash -c "apt update -y && apt install pip -y && pip install --upgrade nvidia-nccl-cu12 && /opt/nim/start-server.sh"
設計成 Dockerfile 編譯以後就可以直接使用 Docker Image 啟動,Dockerfile 如下:
FROM nvcr.io/nim/meta/llama3-8b-instruct:1.0.0
USER root
RUN apt update -y
RUN apt install pip -y
RUN pip install --upgrade nvidia-nccl-cu12
USER 1000
使用 docker build 進行編譯
docker build ./nim --tag nim
確認 Llama3 8b NIM 推論服務佔用的 GPU Memory
重新透過 nvidia-smi 查詢 RTX 4090 GPU 狀態,如下:
docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
看起來用了不少記憶體,如果顯卡沒有 24GB 的話應該也跑不起來。
透過 NIM API 測試 Llama3 大語言模型
NIM Llama Docker 啟動順利以後我們就可以透過 API 進行呼叫,如下:
curl -X 'POST' \
'http://0.0.0.0:8000/v1/chat/completions' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"model": "meta/llama3-8b-instruct",
"messages": [{"role":"user", "content":"你是一個親子故事專家,請用繁體中文寫一個大野狼吃白雪公主的故事,內容需要至少五百字"}],
"max_tokens": 64
}'
獲得的回應如下:
看來結果不是很好,連話都說不清楚,產生 AI 幻覺的情況非常嚴重,未來有硬體的話我可以在試試更大的模型。雖然 Llama3 8b 已經學習的資料不夠強健,但是模型本生對語言的理解還是不錯的。如果直接鎖定在 RAG 的使用情境應該是夠用的,有機會我會來試試看與 LangChain 的整合情況。
關於 NIM Self-hosting License
由於上面的介紹會在自己的 NVIDIA GPU 硬體安裝離線的 NIM Micro Service,實際上這樣的應用是需要 NVIDIA AI Enterprise License,有興趣可以參考 NVIDIA 官方網站的介紹,大家在使用上也需要特別注意授權範圍。
[待解] Docker 執行 NIM 收到 Call to CUDA function failed. 錯誤
之後我更換其他更好的 GPU 想要嘗試跑更大的模型,但是透過 wsl 執行 NIM Docker 的時候後收到另一個錯誤:
torch.distributed.DistBackendError: NCCL error in: ../torch/csrc/distributed/c10d/ProcessGroupNCCL.cpp:1691, unhandled cuda error (run with NCCL_DEBUG=INFO for details), NCCL version 2.19.3
ncclUnhandledCudaError: Call to CUDA function failed.
這個錯誤還在研究中,等有解會更新上來...