我要在linux服务器部署千问14b大模型,一步一步详细的告诉我用命令行和ftp 怎么操作
后面命令需要根据cuda版本调整
nvidia-smi
Wed Dec 10 17:53:02 2025
±----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.105.08 Driver Version: 580.105.08 CUDA Version: 13.0 |
±----------------------------------------±-----------------------±---------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=++======|
| 0 NVIDIA GeForce RTX 4090 Off | 00000000:47:00.0 Off | Off |
| 30% 28C P8 17W / 450W | 68MiB / 49140MiB | 0% Default |
| | | N/A |
±----------------------------------------±-----------------------±---------------------+
±----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| 0 N/A N/A 1395 G /usr/lib/xorg/Xorg 21MiB |
| 0 N/A N/A 1574 G /usr/bin/gnome-shell 15MiB |
±----------------------------------------------------------------------------------------+
可以,咱们按「从 0 到能在终端跟千问 14B 聊天」来一步一步走一遍,用到两件武器:
1)Linux 命令行(SSH)
2)FTP/SFTP(从你本地电脑往服务器丢文件)
下面假设你要部署的是最新版的指令模型 Qwen/Qwen2.5-14B-Instruct,官方推荐直接用 Hugging Face 的 transformers 来推理。(Gitee)
一、前提条件检查(在服务器上)
-
确认有 GPU(没有也能跑,但 14B 非常慢)
bashnvidia-smi能看到显卡信息(显存 24G 起步最舒服),就算过关。
如果没有
nvidia-smi,说明没装驱动,要找管理员先装好 CUDA 驱动。 -
系统假设
下面命令以 Ubuntu 为例(Debian 也类似)。
如果你是 CentOS/Rocky,可以把
apt换成yum或dnf。
二、用命令行连上服务器(SSH)
在你 本地电脑(Windows 推荐用 PowerShell 或 Windows Terminal):
powershell
ssh your_user_name@your_server_ip
# 例如
# ssh zhenyue@1.2.3.4
第一次会问 yes/no,输入 yes,然后输入密码,就登陆到 Linux 上了。
三、准备 Python 环境(命令行)
1. 更新系统并安装基本依赖
bash
# 更新软件源
sudo apt update
# 基础工具
sudo apt install -y git python3 python3-venv python3-pip
2. 创建项目目录与虚拟环境
bash
mkdir -p ~/qwen14b
cd ~/qwen14b
# 创建虚拟环境
python3 -m venv .venv
# 激活虚拟环境
source .venv/bin/activate
之后你每次想用这个项目,都先:
bash
cd ~/qwen14b
source .venv/bin/activate
3. 安装 PyTorch 与 Transformers 等
PyTorch 要根据你服务器的 CUDA 版本来装,这里只给一个「常见情况」示例,你最好根据 PyTorch 官网命令做微调。(OneClick IT Consultancy)
在虚拟环境里:
bash
# 升级 pip
pip install -U pip
# 安装 transformers + accelerate + huggingface_hub 等
pip install -U "transformers>=4.44.0" accelerate huggingface_hub sentencepiece
# PyTorch 示例(以 CUDA 12.1 为例):
pip install torch --index-url https://download.pytorch.org/whl/cu121
如果你的 CUDA 不是 12.1,把 cu121 改成对应版本即可;
只想先跑 CPU 版,也可以简单:
bash
pip install torch --index-url https://download.pytorch.org/whl/cpu
四、配置 Hugging Face 访问(命令行)
Qwen2.5 官方在 Hugging Face 上,建议配置一个 token,这样拉模型比较顺畅。(Gitee)
-
在浏览器打开 Hugging Face,登陆你的账号,个人设置里生成一个
Access Token(记下来)。 -
在服务器上创建配置目录:
bashmkdir -p ~/.huggingface nano ~/.huggingface/token -
把你的
hf_xxx...粘进去,保存退出:nano里按Ctrl+O回车保存- 再按
Ctrl+X退出
五、命令行下载 Qwen 14B 模型
最方便的是用 huggingface-cli 直接下载到本地磁盘(可选步骤,纯在线加载也行)。
-
安装命令行工具:
bashpip install -U huggingface_hub -
在项目目录里运行:
bashcd ~/qwen14b # 下载 Qwen2.5-14B-Instruct 到本地 Qwen2.5-14B-Instruct 目录 huggingface-cli download Qwen/Qwen2.5-14B-Instruct \ --local-dir ./Qwen2.5-14B-Instruct
这一步会占用几十 GB 磁盘,请确保 /home/你的用户 下空间够用。
说明:如果你不提前下载,后面用
from_pretrained("Qwen/Qwen2.5-14B-Instruct")也会自动从网络拉,只是可控性稍差一些。
六、写推理脚本(命令行方式)
1. 在服务器上用编辑器写 Python
bash
cd ~/qwen14b
nano chat_qwen.py
把下面完整代码粘进去:
python
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
MODEL_NAME = "Qwen/Qwen2.5-14B-Instruct" # 或者改成本地目录: "./Qwen2.5-14B-Instruct"
def load_model():
print(f"Loading model: {MODEL_NAME}")
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, use_fast=False)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
torch_dtype="auto",
device_map="auto"
)
return tokenizer, model
def chat_loop(tokenizer, model):
system_prompt = "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."
history = []
print("✅ 模型加载完成,输入内容开始对话,输入 exit / quit 退出。")
while True:
user_input = input("你: ").strip()
if user_input.lower() in ["exit", "quit", "q"]:
print("结束对话,再见~")
break
# 构造 messages(兼容 Qwen 官方 chat 模板):contentReference[oaicite:3]{index=3}
messages = [{"role": "system", "content": system_prompt}]
for u, a in history:
messages.append({"role": "user", "content": u})
messages.append({"role": "assistant", "content": a})
messages.append({"role": "user", "content": user_input})
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer(
[text],
return_tensors="pt"
).to(model.device)
with torch.no_grad():
generated_ids = model.generate(
**model_inputs,
max_new_tokens=512,
do_sample=True,
temperature=0.7,
top_p=0.9,
)
# 去掉输入部分,只保留新生成的回复
new_tokens = generated_ids[0, model_inputs["input_ids"].shape[1]:]
response = tokenizer.decode(new_tokens, skip_special_tokens=True)
print(f"Qwen: {response}\n")
history.append((user_input, response))
if __name__ == "__main__":
tokenizer, model = load_model()
chat_loop(tokenizer, model)
保存退出:Ctrl+O 回车,Ctrl+X。
2. 直接运行测试
确保虚拟环境已激活:
bash
cd ~/qwen14b
source .venv/bin/activate
python chat_qwen.py
第一次会花时间加载模型,出现 ✅ 模型加载完成... 后,就可以在命令行里和千问对话了。
七、用 FTP/SFTP 上传文件(从本地到服务器)
你说要用 FTP,那我们以 FileZilla(图形化客户端) 为例,走一遍从本地上传脚本的流程,适合你在本地改好代码再扔上服务器。
1. 在本地准备代码
在你自己的电脑上,用 PyCharm/VSCode 写好 chat_qwen.py,或者整个项目目录,比如 qwen_project/。
2. 安装并打开 FileZilla
- 下载 FileZilla Client(不是 Server)。
- 打开后点左上角「文件」→「站点管理器」。
3. 配置 SFTP 连接
在站点管理器中新建站点,填写:
- 协议: SFTP - SSH File Transfer Protocol
- 主机: 你的服务器 IP,例如
1.2.3.4 - 端口:
22 - 登录类型: 普通
- 用户: 和你 SSH 登录时一样,例如
zhenyue - 密码: 对应密码
点「连接」,下方右侧就会显示服务器上的文件系统。
4. 上传文件到项目目录
- 在右侧远程目录里,进入你项目目录,例如
/home/zhenyue/qwen14b。 - 左侧是你本地目录,找到你的项目文件夹(例如
qwen_project)。 - 把本地的
chat_qwen.py或整个文件夹拖拽到右侧/home/zhenyue/qwen14b。 - 传输结束后,文件就同步到服务器了。
之后你回到 SSH:
bash
ssh your_user_name@your_server_ip
cd ~/qwen14b
source .venv/bin/activate
python chat_qwen.py
就能以你在本地写的代码为准来跑。
八、如果必须用命令行 FTP/SFTP(纯命令行版)
假如你在另一台 Linux 或 macOS 上,用命令行传文件到服务器,可以用 scp 或 sftp:
1. 用 scp 一次性复制文件
在你本地 Linux/macOS 上:
bash
# 上传单个文件
scp chat_qwen.py your_user_name@your_server_ip:/home/your_user_name/qwen14b/
# 上传整个文件夹
scp -r qwen_project your_user_name@your_server_ip:/home/your_user_name/
2. 用 sftp 交互式上传
bash
sftp your_user_name@your_server_ip
# 进入远程目录
cd qwen14b
# 切换本地目录
lcd /path/to/your/local/project
# 上传文件或目录
put chat_qwen.py
put -r qwen_project
# 退出
bye
九、显存不够时的简单思路(顺口提一句)
14B 全精度对显存要求比较高,官方建议用 vLLM 或量化部署以降低显存占用。(Gitee)
如果你发现一跑就报 CUDA OOM,可以考虑:
- 换成官方的量化模型(例如 INT8 或 4bit 版本)。(Dataloop)
- 或者引入 LMDeploy 之类的加速与量化工具来部署。(Hugging Face)
这些可以再单独给你写一套「低显存部署千问 14B」的脚本。
如果你愿意,你也可以告诉我:
- 服务器是几 G 显存的卡
- 想要「命令行聊天」就够,还是想做「HTTP 接口服务」
我可以在这套基础上,再帮你加一层 FastAPI/vLLM 的部署脚本,直接变成可供你前端或别的服务调用的推理接口 😎
调用方式
好,懂了 👍
你要的流程是:Python 里自动拉 Qwen2.5-14B-Instruct 模型 → 用 FastAPI 封装成 HTTP 接口 。
下面我从「命令行操作」到「完整 FastAPI 代码」一步一步写清楚,你照着敲就能跑起来。
模型用:
Qwen/Qwen2.5-14B-Instruct(官方 HF 仓库)(Hugging Face)显卡:RTX 4090,驱动支持 CUDA 13.0,用 PyTorch CUDA 12.8 轮子就行。
一步一步来:环境准备(命令行)
1. SSH 登录到服务器
在你本地电脑终端(Windows 用 PowerShell / CMD / Git Bash 都可以):
bash
ssh your_user_name@your_server_ip
# 例如:
# ssh sun@1.2.3.4
输入密码后就进服务器了。
2. 创建项目目录 & 虚拟环境
bash
# 随便选个目录,这里用 ~/qwen14b_api
mkdir -p ~/qwen14b_api
cd ~/qwen14b_api
# 创建虚拟环境
python3 -m venv .venv
# 激活虚拟环境(非常关键!后面所有 pip 都在这个环境里)
source .venv/bin/activate
以后每次要启动服务,都先:
bash
cd ~/qwen14b_api
source .venv/bin/activate
3. 安装依赖:PyTorch + Transformers + FastAPI
用你 4090 + CUDA13 的配置,直接装 CUDA 12.8 版的 PyTorch 即可(Dataloop):
bash
# 先升级 pip
pip install -U pip
# 安装 PyTorch(CUDA 12.8 轮子)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128
# 安装 Qwen2.5 需要的 transformers 等
pip install "transformers>=4.44.0" accelerate huggingface_hub sentencepiece
# 安装 FastAPI + Uvicorn
pip install fastapi "uvicorn[standard]"
注意:Qwen2.5 官方要求较新的 transformers,低于 4.37 会报
KeyError: 'qwen2'(Hugging Face),所以我直接写成>=4.44.0。
4.(可选)配置 Hugging Face Token
如果服务器访问 Hugging Face 有权限或限速问题,建议配置一个 token(没有也能试,慢一些/可能失败):
bash
mkdir -p ~/.huggingface
nano ~/.huggingface/token
把你在 Hugging Face 网站生成的 token(hf_xxx...)粘进去:
Ctrl + O回车保存Ctrl + X退出
二、写 FastAPI 服务代码(自动从网络拉取 Qwen 14B)
我们写一个 app_qwen14b.py,启动时会自动 from_pretrained(),需要时才从网络拉模型。
1. 在服务器上新建代码文件
bash
cd ~/qwen14b_api
nano app_qwen14b.py
把下面这一整段粘进去:
python
import torch
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List, Literal, Optional
from transformers import AutoModelForCausalLM, AutoTokenizer
# ==================== 模型配置 ====================
MODEL_NAME = "Qwen/Qwen2.5-14B-Instruct" # 千问2.5 14B 指令版
app = FastAPI(title="Qwen2.5-14B FastAPI Service")
tokenizer = None
model = None
# ==================== 请求 / 响应数据结构 ====================
class Message(BaseModel):
role: Literal["system", "user", "assistant"]
content: str
class ChatRequest(BaseModel):
# 完整消息列表(兼容多轮)
messages: List[Message]
# 可选参数
max_new_tokens: int = 512
temperature: float = 0.7
top_p: float = 0.9
class ChatResponse(BaseModel):
text: str
# ==================== 启动时加载模型 ====================
@app.on_event("startup")
def load_qwen_model():
global tokenizer, model
print(f"🔄 正在加载模型:{MODEL_NAME}(首次会从网络拉取参数,时间会比较长)")
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
torch_dtype="auto", # 自动选择 float16/bfloat16 等
device_map="auto", # 自动把模型放到 GPU
)
# 简单测试一下
_ = model.to("cuda" if torch.cuda.is_available() else "cpu")
print("✅ 模型加载完成,可以开始接受请求了。")
# ==================== 核心对话接口 ====================
@app.post("/chat", response_model=ChatResponse)
def chat(req: ChatRequest):
"""
调用方式:POST /chat
JSON 结构:
{
"messages": [
{"role": "system", "content": "你是一个乐于助人的教学助手。"},
{"role": "user", "content": "帮我设计一节关于欧姆定律的课堂导入。"}
],
"max_new_tokens": 512,
"temperature": 0.7,
"top_p": 0.9
}
"""
if tokenizer is None or model is None:
raise RuntimeError("模型尚未加载完成,请稍后重试。")
# 转成 Qwen 推荐的 chat_template 格式:contentReference[oaicite:3]{index=3}
messages = [m.dict() for m in req.messages]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
inputs = tokenizer(
[text],
return_tensors="pt"
).to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=req.max_new_tokens,
do_sample=True,
temperature=req.temperature,
top_p=req.top_p,
)
# 只取新生成的部分
gen_ids = outputs[0, inputs["input_ids"].shape[1]:]
response_text = tokenizer.decode(gen_ids, skip_special_tokens=True)
return ChatResponse(text=response_text)
然后:
Ctrl + O回车保存Ctrl + X退出
说明:
- 第一次启动 FastAPI 时,会自动从 Hugging Face 下载
Qwen/Qwen2.5-14B-Instruct到本地缓存。- 下载完之后再重启就直接走本地缓存,不会重复拉取。
三、启动 FastAPI 服务(命令行)
虚拟环境要激活:
bash
cd ~/qwen14b_api
source .venv/bin/activate
然后用 uvicorn 启动:
bash
uvicorn app_qwen14b:app --host 0.0.0.0 --port 8000
含义:
app_qwen14b:就是刚才那个app_qwen14b.py文件名(去掉.py):app:文件里定义的app = FastAPI(...)这个对象--host 0.0.0.0:对外网可访问--port 8000:服务端口,可自己改
如果你想多进程一点,可以:
bash
uvicorn app_qwen14b:app --host 0.0.0.0 --port 8000 --workers 2
首次启动时,终端会卡在「正在加载模型」很久,这是正常的,14B 要下载几十 GB;日志打印
✅ 模型加载完成后说明服务就绪。
四、在别的机器 / 本机测试调用(HTTP)
1. 用 curl 测试(最直观)
在你自己的电脑上(只要能访问这台服务器的 8000 端口):
bash
curl -X POST "http://服务器IP:8000/chat" \
-H "Content-Type: application/json" \
-d '{
"messages": [
{"role": "system", "content": "你是一个乐于助人的教学助手。"},
{"role": "user", "content": "帮我设计一节关于欧姆定律的课堂导入。"}
],
"max_new_tokens": 256,
"temperature": 0.7,
"top_p": 0.9
}'
如果一切正常,你会看到返回一个 JSON,大概是:
json
{"text": "好的,可以这样设计课堂导入:......"}
2. 用 Python 调用示例(方便你后续集成)
python
import requests
url = "http://服务器IP:8000/chat"
payload = {
"messages": [
{"role": "system", "content": "你是一个乐于助人的教学助手。"},
{"role": "user", "content": "请帮我分析这节物理课的优点和不足。"}
],
"max_new_tokens": 512,
"temperature": 0.7,
"top_p": 0.9
}
resp = requests.post(url, json=payload, timeout=600)
resp.raise_for_status()
print(resp.json()["text"])
你原来那个「FastAPI /chat」测试脚本,改成这个结构就可以无缝接入。
五、跟你当前习惯对齐的小结
你说的需求其实可以概括为:
「我不想提前用 huggingface-cli 下模型,只要 Python 代码 from_pretrained 就行,然后对外暴露 FastAPI 接口。」
上面的方案完全满足这一点:
- 模型拉取位置 :在
app_qwen14b.py里load_qwen_model()中,通过from_pretrained(MODEL_NAME)自动从网络拉取。 - 部署方式 :用命令行
uvicorn app_qwen14b:app --host 0.0.0.0 --port 8000起服务。 - 调用方式 :所有前端、后端、脚本只要走 HTTP POST
/chat就可以拿到 Qwen2.5-14B-Instruct 的回复。
如果你愿意下一步,我可以帮你:
- 把这个 FastAPI 服务改成「OpenAI 风格接口」(
/v1/chat/completions那一套),你原来的多智能体评课系统可以几乎零改动接入。 - 或者加一个「健康检查接口」/
/health,方便你用 supervisor / systemd 做常驻守护。