大模型的服务器部署

我要在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)


一、前提条件检查(在服务器上)

  1. 确认有 GPU(没有也能跑,但 14B 非常慢)

    bash 复制代码
    nvidia-smi

    能看到显卡信息(显存 24G 起步最舒服),就算过关。

    如果没有 nvidia-smi,说明没装驱动,要找管理员先装好 CUDA 驱动。

  2. 系统假设

    下面命令以 Ubuntu 为例(Debian 也类似)。

    如果你是 CentOS/Rocky,可以把 apt 换成 yumdnf


二、用命令行连上服务器(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)

  1. 在浏览器打开 Hugging Face,登陆你的账号,个人设置里生成一个 Access Token(记下来)。

  2. 在服务器上创建配置目录:

    bash 复制代码
    mkdir -p ~/.huggingface
    nano ~/.huggingface/token
  3. 把你的 hf_xxx... 粘进去,保存退出:

    • nano 里按 Ctrl+O 回车保存
    • 再按 Ctrl+X 退出

五、命令行下载 Qwen 14B 模型

最方便的是用 huggingface-cli 直接下载到本地磁盘(可选步骤,纯在线加载也行)。

  1. 安装命令行工具:

    bash 复制代码
    pip install -U huggingface_hub
  2. 在项目目录里运行:

    bash 复制代码
    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

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

  1. 下载 FileZilla Client(不是 Server)。
  2. 打开后点左上角「文件」→「站点管理器」。

3. 配置 SFTP 连接

在站点管理器中新建站点,填写:

  • 协议: SFTP - SSH File Transfer Protocol
  • 主机: 你的服务器 IP,例如 1.2.3.4
  • 端口: 22
  • 登录类型: 普通
  • 用户: 和你 SSH 登录时一样,例如 zhenyue
  • 密码: 对应密码

点「连接」,下方右侧就会显示服务器上的文件系统。

4. 上传文件到项目目录

  1. 在右侧远程目录里,进入你项目目录,例如 /home/zhenyue/qwen14b
  2. 左侧是你本地目录,找到你的项目文件夹(例如 qwen_project)。
  3. 把本地的 chat_qwen.py 或整个文件夹拖拽到右侧 /home/zhenyue/qwen14b
  4. 传输结束后,文件就同步到服务器了。

之后你回到 SSH:

bash 复制代码
ssh your_user_name@your_server_ip
cd ~/qwen14b
source .venv/bin/activate
python chat_qwen.py

就能以你在本地写的代码为准来跑。


八、如果必须用命令行 FTP/SFTP(纯命令行版)

假如你在另一台 Linux 或 macOS 上,用命令行传文件到服务器,可以用 scpsftp

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.pyload_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 做常驻守护。
相关推荐
大树885 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠5 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质5 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
小宇宙Zz6 小时前
Maven依赖冲突
java·服务器·maven
Inhand陈工6 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智7 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_7 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
古城小栈7 小时前
Unix 与 Linux 异同小叙
linux·服务器·unix
施努卡机器视觉8 小时前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
程序猿阿伟8 小时前
《Chrome离线扩展安装的底层逻辑与场景落地指南》
服务器·网络·chrome