Linux离线部署Dify+Vllm(Qwen2.5-7b&Bge-m3&bge-reranker-v2-m3)
查看显卡配置及模型是否在显卡上运行
nvidia-smi
1. 下载Vllm模型(Qwen2.5-7b)和Bge-m3模型使用国内魔搭ModelScope速度快
shell
#PowerShell管理员
pip install modelscope
python -c "from modelscope import snapshot_download; snapshot_download('Qwen/Qwen2.5-7B-Instruct', local_dir=r'C:\AI\Qwen2.5-7B-Instruct')"
python -c "from modelscope import snapshot_download; snapshot_download('BAAI/bge-m3', local_dir=r'C:\AI\bge-m3')"
#下个1.5B的测试用
python -c "from modelscope import snapshot_download; snapshot_download('deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B', local_dir=r'C:\AI\DeepSeek-R1-Distill-Qwen-1.5B')"
#reranker
python -c "from modelscope import snapshot_download; snapshot_download('BAAI/bge-reranker-v2-m3', local_dir=r'C:\AI\bge-reranker-v2-m3')"
2. 复制文件到Linux系统的/data/models目录下,需先sudo chmod 777/data/models,并校验
shell
#PowerShell管理员:返回True=文件完整
Test-Path C:\AI\Qwen2.5-7B-Instruct\config.json
3. docker compose配置
yml
#vllm-gpu1
vllm-gpu1:
image: vllm/vllm-openai:latest
container_name: vllm-gpu1
runtime: nvidia
ipc: host
shm_size: '8gb'
ports:
- "9000:8000"
volumes:
- /data/models:/models
environment:
- NVIDIA_VISIBLE_DEVICES=1
- CUDA_DEVICE_ORDER=PCI_BUS_ID
- HF_HUB_OFFLINE=1
- TRANSFORMERS_OFFLINE=1
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ['1']
capabilities: [gpu]
command: >
/models/Qwen2.5-7B-Instruct
--served-model-name Qwen2.5-7B-Instruct
--gpu-memory-utilization 0.5
--max-model-len 32768
--port 8000
vllm-embed:
image: vllm/vllm-openai:latest
container_name: vllm-embed1
runtime: nvidia
ipc: host
shm_size: '8gb'
ports:
- "9002:8000"
volumes:
- /data/models:/models
environment:
- NVIDIA_VISIBLE_DEVICES=1
- CUDA_DEVICE_ORDER=PCI_BUS_ID
- TRANSFORMERS_OFFLINE=1
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ['1']
capabilities: [gpu]
command: >
/models/bge-m3
--runner pooling
--model-impl transformers
--enforce-eager
--served-model-name bge-m3
--gpu-memory-utilization 0.1
--port 8000
#用于测试的deepseek-r1-1.5b
vllm-ds:
image: vllm/vllm-openai:latest
container_name: vllm-ds
runtime: nvidia
ipc: host
shm_size: '8gb'
ports:
- "9003:8000"
volumes:
- /data/models:/models
environment:
- NVIDIA_VISIBLE_DEVICES=1
- CUDA_DEVICE_ORDER=PCI_BUS_ID
- HF_HUB_OFFLINE=1
- TRANSFORMERS_OFFLINE=1
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ['1']
capabilities: [gpu]
command: >
/models/deepseek-r1-1.5b
--served-model-name deepseek-r1-1.5b
--gpu-memory-utilization 0.18#注意这里控制使用显存大小<4G够用
--max-model-len 16384
--port 8000
#本地的rerank模型
infinity:
image: michaelf34/infinity:latest
container_name: dify-infinity
runtime: nvidia
environment:
- CUDA_VISIBLE_DEVICES=1
volumes:
- /data/models:/models
ports:
- "9004:7997"
command: >
v2
#可同时加载bge-m3模型但并已测试可行:--model-id /models/bge-m3 --served-model-name BAAI/bge-m3
--model-id /models/bge-reranker-v2-m3 --served-model-name BAAI/bge-reranker-v2-m3
--port 7997
restart: unless-stopped
4. 运行
shell
#Linux
docker compose up -d vllm-gpu1
docker ps -a
#查看容器日志[-f为实时查看]
docker logs vllm-gpu1 -f
#可查看Vllm大模型是否运行在显卡上
nvidia-smi
docker compose up -d vllm-embed
5. 测试
shell
#测试 Qwen 对话大模型√
curl http://127.0.0.1:9000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen2.5-7B-Instruct",
"messages": [{"role": "user", "content": "你运行在第二张L20显卡上吗?"}]
}'
# 测试 Embedding 接口√
curl http://localhost:9002/v1/embeddings \
-H "Content-Type: application/json" \
-d '{"model": "bge-m3", "input": "测试文本"}'
#测试 1.5b 对话大模型√
curl http://localhost:9003/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-r1-1.5b",
"messages": [{"role": "user", "content": "1+1等于几"}]
}'
#测试rerank模型是否成功运行√
docker ps | grep infinity #确认容器运行
curl http://localhost:9004/models #加载模型列表
#测试embed√
curl http://localhost:9004/embeddings \
-H "Content-Type: application/json" \
-d '{
"model":"BAAI/bge-m3",
"input":"测试文本"
}'
#测试rerank√
curl -X POST http://localhost:9004/rerank \
-H "Content-Type: application/json" \
-d '{
"model": "BAAI/bge-reranker-v2-m3",
"query": "医院信息安全管理制度中,谁负责网络安全管理?",
"documents": [
"信息科设专门的网络安全管理员,负责网络安全管理,定期进行安全检查。",
"门诊患者就诊时,诊室内只限一位患者及其家属。",
"员工每年要主动接受安全意识教育与培训。",
"医院成立以院长为组长的信息安全管理领导小组。"
],
"top_n": 3
}'
6. Dify中接入各模型
-
在线Deepseek
-
OpenAI-API-compatible
- text-embedding> http://172.16.100.*:9002/v1
- rerank> http://172.16.100.*:9004
7. *Linux安装nvidia-container-toolkit
shell
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 update
sudo apt install -y nvidia-container-toolkit
#配置docker runtime
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
Dify工作流中代码执行调用其他服务器接口不执行
如代码执行中请求目标服务接口报403
1. .env文件中新增
shell
# 精准放行单个 IP
SSRF_PROXY_ALLOW_PRIVATE_IPS=192.168.10.*/32
# 或者放行整个 192.168.10.0/24 网段
SSRF_PROXY_ALLOW_PRIVATE_IPS=192.168.10.0/24
# 支持多个,逗号分隔
SSRF_PROXY_ALLOW_PRIVATE_IPS=192.168.10.0/24,10.0.0.0/8
2. .env文件中若无则新增一行:SSRF_PROXY_ALLOW_PRIVATE_IPS=
3. 重启ssrf服务
shell
docker compose down ssrf_proxy
docker compose up -d ssrf_proxy
4. 进入sandbox容器中测试
shell
#进入容器sh
docker exec -it 9c080ac70903 sh
#在容器中测试能否访问服务
python3 -c "
import requests
r = requests.get('http://192.168.10.*:*/', timeout=10)
print('Status:', r.status_code)
print('Body:', r.text[:200])
"
5. 如果还不行,修改docker/ssrf_proxy/squid.conf.template,新增两行,然后重建容器docker compose up -d --force-recreate ssrf_proxy
shell
include /etc/squid/dify_common.conf
acl allowed_domains dstdomain .marketplace.dify.ai
http_port ${HTTP_PORT}
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
include /etc/squid/dify_sandbox_proxy.conf
include /etc/squid/dify_allow_private.conf
###新增下面两行
acl my_his_server dst 192.168.10.*
http_access allow my_his_server
http_access deny to_private_networks
http_access allow allowed_domains
http_access allow client_localnet
http_access allow localhost
http_access deny all
