背景介紹
在前一篇文章 RAG 項目對比 之后,確定 Dify 目前最合適的 RAG 框架。本次就嘗試在本地 GPU 設備上部署 Dify 服務。
Dify 是將模型的加載獨立出去的,因此需要選擇合適的模型加載框架。調研一番之后選擇了 Xinference,理由如下:
- 支持多種類型的模型,包括 LLM,Embedding, Rerank, Audio 等多種業務場景的模型需求,一個框架全搞定;
- 方便的模型管理能力,提供可視化頁面快速部署模型
- 支持直接從 ModelScope 下載模型,避免 huggingface 被墻的問題;
本文是 Dify 與 Xinference 最佳組合的 GPU 設備部署流程。為了充分利用 nvidia GPU 的能力,需要先安裝顯卡驅動,CUDA 和 CuDNN,這部分網上的教程比較多了,大家可以自行搜索參考安裝,安裝時需要注意版本需要與自己的 GPU 顯卡版本匹配。
Dify 部署
參考 Dify 官方文檔 進行安裝。
首先需要下載 Dify 對應的代碼:
git clone https://github.com/langgenius/dify.git
之后創建環境變量文件 .env
, 根據需要進行修改,之后就可以基于 docker compose 啟動:
cd dify/docker
cp .env.example .env
docker compose up -d
默認訪問 http:// 應該就可以看到 Dify 的頁面。
docker 鏡像問題
實際執行鏡像拉取時發現,Docker hub 因為監管的原因已經無法訪問了。為了解決這個問題,目前相對可行的方案:
- 利用一些目前可用的鏡像服務,當前(2024-7-11)可用的是 public-image-mirror,通過修改本地的鏡像下載地址進行加速;
- 利用 Github Action 將鏡像拉取至個人阿里云的的私有鏡像倉庫,可以參考 教程;
實際為了簡單直接采用方案 1,在本地文件 /etc/docker/daemon.json
中添加:
{"registry-mirrors": ["https://docker.m.daocloud.io"]
}
如果上面的地址不可用,可以嘗試另一個測試可用的地址:
{"registry-mirrors": ["https://docker.anyhub.us.kg"]
}
修改之后執行下面命令重啟 docker 服務:
sudo systemctl daemon-reload
sudo systemctl restart docker
接下來就可以正常拉取鏡像了。
Xinference 部署
XInference 的部署也選擇基于 docker 部署,可以參考 XInference 部署,實際使用的部署命令為:
docker run -e XINFERENCE_MODEL_SRC=modelscope -v <local model path>:/models -e XINFERENCE_HOME=/models -p 9998:9997 --gpus all registry.cn-hangzhou.aliyuncs.com/xprobe_xinference/xinference:latest xinference-local -H 0.0.0.0
各位使用時將上面命令行中的 <local model path>
替換為期望服務器上模型存儲的路徑即可
上面的命令利用 XINFERENCE_MODEL_SRC=modelscope
指定了模型最終是從 modelscope 下載的,這樣國內下載模型鏡像的速度比較快。
上面的命令會將 docker 中的 9997
端口映射至本地的 9998
端口,部署完成后訪問 http://<server ip>:9998/ui
就可以看到 XInference 可視化頁面,有需要可以調整服務器上實際占用的端口。
docker GPU 不可用
上面的命令實際執行時會報錯 docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
, docker 目前是不能直接使用 GPU 設備的。
此時需要參考 Nvidia 文檔 安裝 nvidia-container-toolkit
首先需要先補全 apt-get 下載源:
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
接下來更新源,安裝對應的包:
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
安裝完成之后修改 docker 配置文件 /etc/docker/daemon.json
:
{"default-runtime": "nvidia","runtimes": {"nvidia": {"path": "nvidia-container-runtime","runtimeArgs": []}}
}
之后執行 sudo systemctl restart docker
重啟 docker。
此時再執行上面的 docker run
命令去使用 GPU 設備就沒問題了。
Dify 模型配置
上述服務配置好之后,就可以在 Xinference 下載所需的模型,XInference 啟動后實際會占用服務器上的 9998。因此訪問 http://<server ip>:9998/ui
就可以進入可視化頁面下載所需的模型;
在 Xinference 上下載和運行所需的模型后可以返回 Dify 可視化頁面,在 Dify 的設置頁中配置對應的模型,對應的頁面如下所示:
RAG 一般情況下需要配置上 LLM, Text Embedding 和 Rerank 模型。配置完成后就可以自由玩耍了。
總結
本文是實際部署 Dify + Xinference 組合的完整流程,實際上如果 docker 可用的話,整體的流程還是比較絲滑的。期望給后面折騰 Dify 部署的一些幫助,減少重復的踩坑。