我要在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 非常慢)
nvidia-smi能看到显卡信息(显存 24G 起步最舒服),就算过关。
如果没有nvidia-smi,说明没装驱动,要找管理员先装好 CUDA 驱动。系统假设
下面命令以 Ubuntu 为例(Debian 也类似)。
如果你是 CentOS/Rocky,可以把apt换成yum或dnf。
二、用命令行连上服务器(SSH)
在你本地电脑(Windows 推荐用 PowerShell 或 Windows Terminal):
ssh your_user_name@your_server_ip# 例如# ssh zhenyue@1.2.3.4第一次会问yes/no,输入yes,然后输入密码,就登陆到 Linux 上了。
三、准备 Python 环境(命令行)
1. 更新系统并安装基本依赖
# 更新软件源sudoaptupdate# 基础工具sudoaptinstall-ygitpython3 python3-venv python3-pip2. 创建项目目录与虚拟环境
mkdir-p ~/qwen14bcd~/qwen14b# 创建虚拟环境python3 -m venv .venv# 激活虚拟环境source.venv/bin/activate之后你每次想用这个项目,都先:
cd~/qwen14bsource.venv/bin/activate3. 安装 PyTorch 与 Transformers 等
PyTorch 要根据你服务器的 CUDA 版本来装,这里只给一个「常见情况」示例,你最好根据 PyTorch 官网命令做微调。(OneClick IT Consultancy)
在虚拟环境里:
# 升级 pippipinstall-U pip# 安装 transformers + accelerate + huggingface_hub 等pipinstall-U"transformers>=4.44.0"accelerate huggingface_hub sentencepiece# PyTorch 示例(以 CUDA 12.1 为例):pipinstalltorch --index-url https://download.pytorch.org/whl/cu121如果你的 CUDA 不是 12.1,把cu121改成对应版本即可;
只想先跑 CPU 版,也可以简单:
pipinstalltorch --index-url https://download.pytorch.org/whl/cpu四、配置 Hugging Face 访问(命令行)
Qwen2.5 官方在 Hugging Face 上,建议配置一个 token,这样拉模型比较顺畅。(Gitee)
在浏览器打开 Hugging Face,登陆你的账号,个人设置里生成一个
Access Token(记下来)。在服务器上创建配置目录:
mkdir-p ~/.huggingfacenano~/.huggingface/token把你的
hf_xxx...粘进去,保存退出:nano里按Ctrl+O回车保存- 再按
Ctrl+X退出
五、命令行下载 Qwen 14B 模型
最方便的是用huggingface-cli直接下载到本地磁盘(可选步骤,纯在线加载也行)。
安装命令行工具:
pipinstall-U huggingface_hub在项目目录里运行:
cd~/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
cd~/qwen14bnanochat_qwen.py把下面完整代码粘进去:
fromtransformersimportAutoModelForCausalLM,AutoTokenizerimporttorch MODEL_NAME="Qwen/Qwen2.5-14B-Instruct"# 或者改成本地目录: "./Qwen2.5-14B-Instruct"defload_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")returntokenizer,modeldefchat_loop(tokenizer,model):system_prompt="You are Qwen, created by Alibaba Cloud. You are a helpful assistant."history=[]print("✅ 模型加载完成,输入内容开始对话,输入 exit / quit 退出。")whileTrue:user_input=input("你: ").strip()ifuser_input.lower()in["exit","quit","q"]:print("结束对话,再见~")break# 构造 messages(兼容 Qwen 官方 chat 模板):contentReference[oaicite:3]{index=3}messages=[{"role":"system","content":system_prompt}]foru,ainhistory: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)withtorch.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. 直接运行测试
确保虚拟环境已激活:
cd~/qwen14bsource.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:
sshyour_user_name@your_server_ipcd~/qwen14bsource.venv/bin/activate python chat_qwen.py就能以你在本地写的代码为准来跑。
八、如果必须用命令行 FTP/SFTP(纯命令行版)
假如你在另一台 Linux 或 macOS 上,用命令行传文件到服务器,可以用scp或sftp:
1. 用scp一次性复制文件
在你本地 Linux/macOS 上:
# 上传单个文件scpchat_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交互式上传
sftpyour_user_name@your_server_ip# 进入远程目录cdqwen14b# 切换本地目录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 都可以):
sshyour_user_name@your_server_ip# 例如:# ssh sun@1.2.3.4输入密码后就进服务器了。
2. 创建项目目录 & 虚拟环境
# 随便选个目录,这里用 ~/qwen14b_apimkdir-p ~/qwen14b_apicd~/qwen14b_api# 创建虚拟环境python3 -m venv .venv# 激活虚拟环境(非常关键!后面所有 pip 都在这个环境里)source.venv/bin/activate以后每次要启动服务,都先:
cd~/qwen14b_apisource.venv/bin/activate3. 安装依赖:PyTorch + Transformers + FastAPI
用你 4090 + CUDA13 的配置,直接装 CUDA 12.8 版的 PyTorch 即可(Dataloop):
# 先升级 pippipinstall-U pip# 安装 PyTorch(CUDA 12.8 轮子)pipinstalltorch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128# 安装 Qwen2.5 需要的 transformers 等pipinstall"transformers>=4.44.0"accelerate huggingface_hub sentencepiece# 安装 FastAPI + Uvicornpipinstallfastapi"uvicorn[standard]"注意:Qwen2.5 官方要求较新的 transformers,低于 4.37 会报
KeyError: 'qwen2'(Hugging Face),所以我直接写成>=4.44.0。
4.(可选)配置 Hugging Face Token
如果服务器访问 Hugging Face 有权限或限速问题,建议配置一个 token(没有也能试,慢一些/可能失败):
mkdir-p ~/.huggingfacenano~/.huggingface/token把你在 Hugging Face 网站生成的 token(hf_xxx...)粘进去:
Ctrl + O回车保存Ctrl + X退出
二、写 FastAPI 服务代码(自动从网络拉取 Qwen 14B)
我们写一个app_qwen14b.py,启动时会自动from_pretrained(),需要时才从网络拉模型。
1. 在服务器上新建代码文件
cd~/qwen14b_apinanoapp_qwen14b.py把下面这一整段粘进去:
importtorchfromfastapiimportFastAPIfrompydanticimportBaseModelfromtypingimportList,Literal,OptionalfromtransformersimportAutoModelForCausalLM,AutoTokenizer# ==================== 模型配置 ====================MODEL_NAME="Qwen/Qwen2.5-14B-Instruct"# 千问2.5 14B 指令版app=FastAPI(title="Qwen2.5-14B FastAPI Service")tokenizer=Nonemodel=None# ==================== 请求 / 响应数据结构 ====================classMessage(BaseModel):role:Literal["system","user","assistant"]content:strclassChatRequest(BaseModel):# 完整消息列表(兼容多轮)messages:List[Message]# 可选参数max_new_tokens:int=512temperature:float=0.7top_p:float=0.9classChatResponse(BaseModel):text:str# ==================== 启动时加载模型 ====================@app.on_event("startup")defload_qwen_model():globaltokenizer,modelprint(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"iftorch.cuda.is_available()else"cpu")print("✅ 模型加载完成,可以开始接受请求了。")# ==================== 核心对话接口 ====================@app.post("/chat",response_model=ChatResponse)defchat(req:ChatRequest):""" 调用方式:POST /chat JSON 结构: { "messages": [ {"role": "system", "content": "你是一个乐于助人的教学助手。"}, {"role": "user", "content": "帮我设计一节关于欧姆定律的课堂导入。"} ], "max_new_tokens": 512, "temperature": 0.7, "top_p": 0.9 } """iftokenizerisNoneormodelisNone:raiseRuntimeError("模型尚未加载完成,请稍后重试。")# 转成 Qwen 推荐的 chat_template 格式:contentReference[oaicite:3]{index=3}messages=[m.dict()forminreq.messages]text=tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True)inputs=tokenizer([text],return_tensors="pt").to(model.device)withtorch.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)returnChatResponse(text=response_text)然后:
Ctrl + O回车保存Ctrl + X退出
说明:
- 第一次启动 FastAPI时,会自动从 Hugging Face 下载
Qwen/Qwen2.5-14B-Instruct到本地缓存。- 下载完之后再重启就直接走本地缓存,不会重复拉取。
三、启动 FastAPI 服务(命令行)
虚拟环境要激活:
cd~/qwen14b_apisource.venv/bin/activate然后用uvicorn启动:
uvicorn app_qwen14b:app --host0.0.0.0 --port8000含义:
app_qwen14b:就是刚才那个app_qwen14b.py文件名(去掉.py):app:文件里定义的app = FastAPI(...)这个对象--host 0.0.0.0:对外网可访问--port 8000:服务端口,可自己改
如果你想多进程一点,可以:
uvicorn app_qwen14b:app --host0.0.0.0 --port8000--workers2首次启动时,终端会卡在「正在加载模型」很久,这是正常的,14B 要下载几十 GB;日志打印
✅ 模型加载完成后说明服务就绪。
四、在别的机器 / 本机测试调用(HTTP)
1. 用curl测试(最直观)
在你自己的电脑上(只要能访问这台服务器的 8000 端口):
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,大概是:
{"text":"好的,可以这样设计课堂导入:……"}2. 用 Python 调用示例(方便你后续集成)
importrequests 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 做常驻守护。