在 Ubuntu 服务器重启后,自动完成以下任务:
- ✅ 自动启动
xinference
Docker 容器(通过docker-compose
) - ✅ 等待 Xinference 服务就绪
- ✅ 自动通过 API 加载
qwen3-32b-awq
模型
✅ 完整解决方案:使用 systemd 服务 + 启动脚本
我们将创建一个 systemd
服务,它会在系统启动时自动运行一个脚本,该脚本负责:
- 启动容器
- 等待 API 就绪
- 调用
curl
加载模型
🛠️ 第一步:准备目录结构
确保你的项目目录如下:
bash
/home/ubuntu/xinference/
├── docker-compose.yml
├── data/
│ └── .xinference/ # 模型缓存
└── scripts/
└── start-xinference.sh # 自动启动脚本
📜 第二步:创建启动脚本 start-xinference.sh
bash
#!/bin/bash
# 脚本路径:/home/ubuntu/xinference/scripts/start-xinference.sh
# 功能:启动容器并加载模型
set -e # 任意命令失败则退出
export COMPOSE_DOCKER_CLI_BUILD=0
export DOCKER_BUILDKIT=0
SCRIPT_DIR="/home/ubuntu/xinference"
COMPOSE_FILE="$SCRIPT_DIR/docker-compose.yml"
API_URL="http://192.168.1.111:9997/v1/models"
MAX_RETRIES=60
RETRY_INTERVAL=5
cd "$SCRIPT_DIR"
echo "[$(date)] Starting xinference container..."
# 1. 启动容器(如果已存在则重启)
#docker compose down > /dev/null 2>&1 || true
#docker compose up -d
docker compose restart
sleep 10
echo "[$(date)] Waiting for Xinference API to be ready..."
# 2. 等待 API 健康检查就绪
for i in $(seq 1 $MAX_RETRIES); do
response=$(curl -s -w " %{http_code}" "$API_URL" 2>&1)
body=$(echo "$response" | sed 's/ $.*$$//')
status_code=$(echo "$response" | awk '{print $NF}')
if [ "$status_code" -eq 200 ] && echo "$body" | grep -q '"object":"list"'; then
echo "[$(date)] Xinference is ready. Current models: $body"
break
else
if [ $i -eq $MAX_RETRIES ]; then
echo "❌ Error: Xinference failed to start within $(($MAX_RETRIES * $RETRY_INTERVAL)) seconds."
exit 1
fi
echo "⏳ Waiting for Xinference... ($i/$MAX_RETRIES)"
sleep $RETRY_INTERVAL
fi
done
# 3. 加载 Qwen3 模型
echo "[$(date)] Loading Qwen3-32B-AWQ model via API..."
curl -X POST "http://192.168.1.111:9997/v1/models" \
-H "Content-Type: application/json" \
-d '{
"model_name": "qwen3",
"model_type": "LLM",
"model_engine": "vLLM",
"model_format": "awq",
"size_in_billions": 32,
"quantization": "Int4",
"n_gpu": "auto",
"replica": 1,
"n_worker": 1,
"gpu_idx": [0],
"download_hub": "modelscope",
"enable_thinking": true,
"reasoning_content": false
}'
if [ $? -eq 0 ]; then
echo "[$(date)] Model '$MODEL_UID' loaded successfully."
else
echo "[$(date)] Failed to load model."
exit 1
fi
🔐 第三步:赋予脚本可执行权限
bash
chmod +x /home/ubuntu/xinference/scripts/start-xinference.sh
📦 第四步:创建 systemd 服务
创建服务文件:
bash
sudo nano /etc/systemd/system/xinference.service
✅ 内容如下:
ini
[Unit]
Description=Xinference Auto Start and Load Model
After=multi-user.target docker.service
Requires=docker.service
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/xinference
ExecStart=/home/ubuntu/xinference/scripts/start-xinference.sh
TimeoutStartSec=600
StandardOutput=journal
StandardError=journal
Restart=on-failure
RestartSec=30
[Install]
WantedBy=multi-user.target
🔁 第五步:启用 systemd 服务
bash
# 重载 systemd 配置
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
# 启用开机自启
sudo systemctl enable xinference.service
# (可选)立即测试
sudo systemctl start xinference.service
# 查看日志
sudo journalctl -u xinference.service -f
✅ 验证是否成功
- 重启服务器
bash
sudo reboot
- 登录后检查
bash
# 查看服务状态
systemctl status xinference.service
# 查看日志
journalctl -u xinference.service --since "1 hour ago"
# 检查容器是否运行
docker ps
# 检查模型是否加载
curl http://192.168.1.119997/v1/models
你应该看到:
- 容器
xinference
正在运行 - 模型
qwen3-32b-awq
已加载 - 日志显示 "Model loaded successfully"
📌 注意事项
项目 | 说明 |
---|---|
IP 地址 | 确保 192.168.10.22 是你的服务器 IP,否则修改脚本中的 API_URL |
用户权限 | 脚本以 ubuntu 用户运行,确保该用户在 docker 组中: sudo usermod -aG docker ubuntu |
模型加载时间 | Qwen3-32B-AWQ 首次加载可能需要 5--10 分钟(下载 + 加载) |
日志查看 | 使用 journalctl 查看最准确的启动过程 |
重试机制 | 脚本最多等待 5 分钟(60×5s)API 就绪 |
✅ 可选优化:添加模型加载状态检查
你可以在脚本末尾添加轮询,确保模型真的加载完成:
bash
# 等待模型加载完成
echo "[$(date)] Waiting for model to be ready..."
for i in $(seq 1 120); do
if curl -s "http://192.168.10.22:9997/v1/models/$MODEL_UID" | grep -q '"model_type":"LLM"'; then
echo "[$(date)] Model is ready."
break
fi
sleep 5
done
🎉 完成!
现在,每次服务器重启后,Xinference 容器将自动启动,并自动加载 qwen3-32b-awq
模型,全程无需人工干预。