大模型的服务器部署

我要在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 做常驻守护。
相关推荐
数字哨兵(和中)2 小时前
和中科技分享高危漏洞CVE-2025-51482修复方法
运维·服务器·网络·安全
chenyuhao20242 小时前
Linux系统编程:进程控制
linux·运维·服务器·开发语言·c++·后端
峰顶听歌的鲸鱼2 小时前
14.docker:镜像
运维·笔记·docker·容器·学习方法
java_logo2 小时前
Apache RocketMQ Docker 容器化部署指南
运维·docker·容器·kafka·kubernetes·apache·rocketmq
落羽的落羽2 小时前
【Linux系统】进程终止、进程等待与进程替换的概念与实现
linux·服务器·c++·人工智能·深度学习·机器学习·游戏引擎
博语小屋4 小时前
实现简单日志
linux·服务器·数据库·c++
珠海西格电力10 小时前
零碳园区工业厂房光伏一体化(BIPV)基础规划
大数据·运维·人工智能·智慧城市·能源
土星云SaturnCloud11 小时前
不止是替代:从机械风扇的可靠性困局,看服务器散热技术新范式
服务器·网络·人工智能·ai
liulilittle11 小时前
C++ 浮点数封装。
linux·服务器·开发语言·前端·网络·数据库·c++