一、LM

1、概念

  • 大模型(Large Model) 是指拥有超大参数规模、海量训练数据和强泛化能力的人工智能模型。此类模型通常基于深度神经网络,尤其是 Transformer 架构,能够在自然语言处理、计算机视觉、语音识别、代码生成等多种任务中展现出卓越的性能与迁移能力
  • 典型代表包括 GPT 系列、BERT、T5、LLaMA 等

2、核心特征

  • 参数规模庞大:参数数量通常在数亿到数千亿,甚至上万亿级别。庞大的参数量赋予模型更强的表示与推理能力
  • 训练数据广泛:使用互联网级别的多模态数据(文本、图像、代码、音频等)进行训练,覆盖丰富的知识和场景
  • 通用性与泛化能力强:大模型并非只针对单一任务,而是具备“预训练 + 微调”的范式,能够适应多种下游任务,能通过少量样本甚至零样本完成新任务
  • 涌现能力:随着规模扩大,模型在某些任务上会展现出小模型不具备的能力,如复杂推理、跨语言翻译、代码生成等

3、应用方向

  • Agent智能体

    • 概念:像一个“全能私人助理”,能自己分析问题、拆解任务、调用工具解决问题
    • 例子:你想周末去露营,告诉它:“帮我找个离市区近、能带宠物、有烧烤区的露营地,订周六的房间,再推荐附近超市买食材。”它自动完成:搜攻略 → 筛选地点 → 查天气 → 订营地 → 生成购物清单 → 发到你手机
    • 好处:不用自己一步步操作,AI能“动脑子”帮你搞定复杂任务
    • 流程:用户输入 -> 拆解任务 -> 意图识别 -> 调用对应的函数并执行 -> 完成执行
  • 语音聊天助手

    • 概念:像“升级版Siri”,能自然对话、理解语气,甚至模拟真人情感
    • 例子:你开车时说:“我好困啊,来点提神的音乐,再导航到最近的咖啡店。”它回答:“马上切到摇滚歌单!前方500米有星巴克,要帮你点一杯冰美式吗?”(还能学你喜欢的说话风格)
    • 好处:不用打字,动动嘴就能聊天、查信息、控制智能家居,像有个“随身陪聊”
    • 流程:语音输入 -> 语音识别转文字 -> 大模型对话 -> 文本转语音 -> 完成对话
  • 医学客服

    • 概念:医院的“虚拟前台”,能解答常见问题、提醒用药、分诊建议
    • 例子:你半夜胃疼,打开医院APP问:“吃了火锅后胃痛,该挂哪个科?现在能吃什么药缓解?”AI回答:“建议挂消化内科,暂时可服用XX药(非处方)。若呕吐加重,请立即急诊。”并推送附近24小时药店
    • 好处:24小时在线,快速解答小毛病,避免排队问医生,隐私问题也能匿名咨询
    • 流程:问题输入 -> 检索知识库 -> 问题拼接 -> 大模型对话 -> 给予回复

4、开发流程

  • 大模型开发是一个系统工程,涉及数据、模型、算力、训练、部署、安全与迭代等多个环节
image-20250420203018771
  • 任务定义与需求分析
    • 明确应用场景(如对话、写作、推荐、图像识别等)
    • 选择模型类型(NLP、CV、多模态等)
  • 数据准备与预处理
    • 收集高质量、大规模数据(文本、图像、音频等)
    • 去噪清洗、标注、格式转换、去重与分词等
  • 模型设计与选择
    • 选择合适的模型架构(如GPT、BERT、ViT、T5等)
    • 设定层数、宽度、注意力机制等结构参数
  • 训练策略与资源配置
    • 分布式训练/混合精度训练
    • 使用大规模算力资源(GPU/TPU集群)
    • 设置优化器(AdamW)、学习率调度等参数
  • 评估与调优
    • 评估指标:PPL、准确率、BLEU、ROUGE、F1等
    • 微调/指令调优(Instruction tuning)/RLHF等方法提升效果
  • 推理部署与压缩优化
    • 部署到服务器或边缘端(云部署、API服务)
    • 模型量化、裁剪、蒸馏、MoE等手段提升推理效率
  • 安全机制与合规检测
    • 防止生成有害/敏感内容
    • 对输出进行内容审查、对抗样本防御、模型水印等
  • 持续迭代与生态构建
    • 基于用户反馈持续优化
    • 构建插件系统、开发者平台等生态体系

5、模型开发关键点

  • 在大模型应用开发时,不会从头开始构建一个新的模型,基于已有基座模型进行二次开发是行业主流实践

  • 选用已有的基座模型,并采用相应的技术手段优化大模型,如:微调,RAG,并行推理等

  • 选用流行且成熟的框架,通过参数调整和功能集成实现业务需求,避免重复造轮子

二、LLM

  • 大语言模型(LLM) 是指在大规模文本语料上预训练、以自然语言处理为核心能力的深度学习模型。它们通常基于 Transformer 架构,参数量从数亿到数千亿甚至万亿级别,能够在无需特定任务训练的情况下展现出强大的语言理解与生成能力

1、API 调用

  • 大模型通过 API 调用是目前最常见、最便捷的使用方式,用户无需训练模型,只需调用接口即可享受强大的 AI 能力,比如文本生成、翻译、图像识别、代码补全等

1.1 基本流程

  • 获取 API 权限:注册平台账号(如 OpenAI、DeepSeek、阿里通义、讯飞星火等)、获取 API Key
  • 准备请求参数:选择模型、设置请求体【对应的 AI 开放平台的开发文档都有案例】
  • 发起 API 请求:使用编程语言通过 HTTP 协议调用接口
  • 解析响应结果:获取模型返回内容(如文本、图片链接、结构化数据等)、可与前端应用系统集成使用

1.2 基本特征

image-20250420205345161
  • 大模型 API 调用将复杂的模型能力简化为标准化服务,核心价值在于:

    • 降低使用门槛:无需本地部署千亿参数模型,节省硬件与运维成本

      • 灵活适配场景:通过参数调节和上下文学习快速满足业务需求

      • 规模化支持:依托云计算实现高可用、低延迟的企业级服务

1.3 DeepSeek 接口调用

  • DeepSeek 作为国内优秀的 LLM 平台,是一个不错的选择,这个接口调用要给钱

1.3.1 准备工作

  • 访问 DeepSeek 官网,并注册账号:【 https://www.deepseek.com/ 】

  • 注册账号并且充值

  • 创建 API-key【仅在创建时可见可复制】

  • 查看使用手册【个人能力的体现】

1.3.2 非流式输出

  • 等模型生成完整结果后一次性返回,适合短文本、结构化内容提取等任务

  • 优点:

    • 使用简单,一次性拿到完整结果

    • 适合分析处理、摘要抽取、短文本问答等

  • 缺点:

    • 响应时间长,特别是文本很长时

    • 体验较差,用户需要等待全部生成完才能看到内容

  • 环境安装:

pip install openai
  • 案例代码:role 一般设置为 system【用于设定 AI 的行为方式、角色或语气】、user【表示用户输入的内容,是 AI 需要回答的问题或请求】、assistant【表示 AI 先前的回复,用于保留对话上下文】
# Please install OpenAI SDK first: `pip3 install openai`

from openai import OpenAI

# 自己去注册
api_key = ""

client = OpenAI(api_key=api_key, base_url="https://api.deepseek.com")

response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[
        {"role": "system", "content": "You are a helpful assistant"},
        {"role": "user", "content": "请回答为什么人需要运动"},
    ],
    stream=False
)

print(response.choices[0].message.content)
  • 运行结果:### 和 ** 等符号是 markdown 格式,可以解析【前端】
当然!人需要运动的原因是多方面的,它不仅关乎身体健康,也深刻影响着我们的心理状态和生活质量。以下是几个核心原因的科学解释:

### 1. 维持身体健康与预防疾病
   - **强化心血管系统**:规律运动能增强心肌力量,改善血液循环,降低血压和“坏”胆固醇水平,从而显著减少患心脏病、中风等心血管疾病的风险。
   - **控制体重与代谢健康**:运动消耗热量,帮助维持健康体重,同时提高胰岛素敏感性,是预防和管理2型糖尿病的关键。
   - **增强骨骼与肌肉**:负重运动(如步行、跑步、力量训练)能刺激骨骼生长,预防骨质疏松;同时保持肌肉力量和耐力,减缓因年龄增长导致的肌肉流失。
   - **提升免疫力**:适度运动能促进免疫细胞循环,帮助身体更有效抵御感染(如感冒),但需注意过度运动可能暂时抑制免疫 function。

### 2. 促进心理健康与情绪平衡
   - **释放“快乐激素”**:运动促使大脑释放内啡肽(endorphins)、多巴胺和血清素,这些神经递质能天然缓解压力、减轻焦虑和抑郁症状,提升幸福感。
   - **改善认知功能**:运动增加大脑血流量,促进海马体(负责记忆)的神经生成,有助于提高学习能力、注意力和创造力,并降低认知衰退风险(如阿尔茨海默病)。
   - **调节睡眠节律**:日间运动有助于加深夜间睡眠,改善睡眠质量,但避免睡前剧烈运动以免过度兴奋。

### 3. 提升生活质量与社交功能
   - **增强能量与耐力**:日常活动会变得轻松,减少疲劳感,使人更精力充沛。
   - **促进社交互动**:团队运动、健身课程或户外活动(如 hiking)提供了社交机会,增强归属感和支持网络。
   - **延缓衰老效应**:保持运动习惯的人往往更具活力,身体机能和独立性维持更久。

### 4. 现代生活方式的必要补偿
   - **对抗久坐危害**:多数现代工作需长时间久坐,这与多种健康风险相关。运动能抵消久坐带来的负面影响,如肌肉僵硬、代谢减慢。
   - **缓解数字疲劳**:运动提供脱离屏幕的机会,让眼睛和大脑得到休息,减少数字设备带来的精神疲劳。

### 如何科学运动?
世界卫生组织建议成年人每周至少进行**150分钟中等强度**(如快走、游泳)或**75分钟高强度**(如跑步、快速骑行)有氧运动,并结合**2次以上力量训练**。关键是选择自己喜欢且能长期坚持的方式,循序渐进。

**总结**:运动不是可选项,而是维持身心健康的必需品。它像一种“万能药”,无需昂贵成本,却能全方位提升生命质量。即使从小幅度的活动开始(如每天散步),也能带来显著益处。

1.3.3 流式输出

  • 服务器将响应内容一段一段地实时返回,适合长文本、对话、写作等需要即时反馈的场景

  • 优点:

    • 响应快:无需等全部生成完毕,先生成先返回

    • 体验佳:像人打字一样流畅,常用于对话机器人

    • 可中断:用户可随时打断流式响应过程

  • 缺点:

    • 编程稍复杂,需要处理数据流拼接【前端处理起来麻烦】

    • 不易直接使用普通 HTTP 请求工具(如 Postman)

  • 原理:

    image-20250420211402987
  • 流式推理实现需要使用生成器

import time


# 生成器函数
def test():
    for i in range(10):
        # 模拟耗时
        time.sleep(1)
        # 生成器函数,使用 yield 关键字返回值
        yield i


if __name__ == "__main__":
    data = test()
    # data 是一个生成器,可以想象成一个队列,每读取一次,就会执行一次函数体
    print(data)
    for result in data:
        # 读取生成器中的值
        print(result)
  • 案例代码:
# Please install OpenAI SDK first: `pip3 install openai`

from openai import OpenAI

api_key = "sk-dc71375607d345db8b96fe57119f497b"

client = OpenAI(api_key=api_key, base_url="https://api.deepseek.com")

response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[
        {"role": "system", "content": "You are a helpful assistant"},
        {"role": "user", "content": "请回答为什么人需要运动"},
    ],
    stream=True
)

out = []
for chunk in response:
    # 获取流式输出
    item = chunk.choices[0].delta.content
    print(item, end="")
    # 把输出添加到列表中
    out.append(item)
print(out)

1.3.4 总结对比

项目 流式输出 非流式输出
返回方式 边生成边返回 全部生成后一次返回
响应速度 快 慢(尤其是长文本)
使用体验 更自然(打字式) 等待过程较长
编程复杂度 稍复杂(需拼接) 简单
适用场景 对话生成、直播问答 简短回复、结构化处理

1.3.5 Temperature

  • 在 DeepSeek / OpenAI 风格的 API 中,temperature 是一个非常关键的参数,用来控制模型生成回复时的 随机性与多样性

  • 取值范围:一般是 0 ~ 1

  • 影响机制:在生成文本时,模型会根据概率分布选择下一个 token

    • 低 temperature(接近 0):
      • 模型更“保守”,倾向选择概率最高的词
      • 输出更稳定、确定性强,但创造性较低
      • 常用于代码生成、医学问答、法律文书等需要精确性的场景
    • 高 temperature(接近 1 或更高):
      • 模型更“冒险”,在候选词之间会更多探索
      • 输出更有创意、多样性强,但可能偏离主题或引入幻觉
      • 常用于创意写作、头脑风暴、广告文案等场景

2、AI 开放平台

三、大模型本地部署

1、Qwen

  • 官网:【 https://www.aliyun.com/product/tongyi 】

  • 开源:【 https://github.com/QwenLM/Qwen 】

  • 在国产大模型领域,Qwen 系列一直稳居前列,其出色的性能使其在多项评测中名列前茅。作为阿里巴巴的一项重要研发成果,Qwen 系列的开源版本在业内备受瞩目,且长期以来在各大榜单上表现优异

  • 优点:

    • 多模态能力:部分版本支持文本、图像、音频等多模态输入与生成
    • 超长上下文:最新模型支持高达128K tokens的上下文窗口,适合长文档处
    • 高性能:在权威基准(如MMLU、C-Eval)上表现优异,接近或超越国际主流模型
    • 工具调用:支持外部API调用、代码解释器等,增强复杂任务处理能力

2、线上体验

3、本地部署

3.1 modelscope

3.2 huggingface

3.3 Ollama【推荐】

  • Ollama是一个开源工具,用于在本地计算机上快速运行、管理和部署大型语言模型(LLMs)。它支持多种开源模型(如 Llama 3、Mistral、Gemma、Qwen 等),并提供简单命令行操作,适合开发者和研究者本地测试 LLM

  • 官网:【 https://ollama.com/ 】

  • 支持的模型:【 https://ollama.com/search 】

  • 几个重要的概念:

    • ggml:轻量高效的本地张量计算引擎,GGUF 是 ggml 的新模型格式
    • llama.cpp:基于 ggml 的大模型推理框架,llama.cpp = “用 ggml 跑 LLaMA 模型的完整系统”
    • Ollama:把 llama.cpp 封装成“一键运行 AI”的工具
    • 用 Ollama 运行模型,本质上就是在用 llama.cpp + ggml

3.3.1 安装

  • Ollama 下载后,启动安装程序,会安装在C:\Users\cc\AppData\Local\Programs\Ollama

  • 如果想要修改安装地址:

    • 方式一:命令安装
    # 指定ollama安装路径,路径不能有空格
    ollama.exe /S /D=D:\ollama
    
    • 方式二:安装后把整个 ollama 文件夹复制到其他磁盘

3.3.2 基本命令

命令 说明
ollama pull <模型名> 下载模型(如 qwen2.5:7b)
ollama run <模型名> 运行模型交互式对话
ollama list 查看已安装模型
ollama rm <模型名> 删除模型
image-20250618204701996

3.3.3 下载模型

  • 可以通过配置环境变量的方式,设置 Ollama 下载模型的存储位置,默认在 C 盘下
  • 下载模型命令
ollama pull qwen:7b # 下载 Qwen-7B 模型

3.3.4 运行模型

  • 直接 ollama run 模型,如果想要运行的模型没下载,会先下载
  • 默认情况下,本地部署的大模型启动之后,会占用端口 11434
ollama run qwen:7b # 运行模型

3.3.5 适用场景

  • 开发测试 – 快速验证模型效果

  • 离线应用 – 无网络环境下使用 LLM

  • 轻量级部署 – 替代云 API 的高成本方案

3.3.6 apipost

  • apipost 是一个用来测试接口的工具,我们可以使用这个工具来访问 ollama 本地部署的大模型

  • 发送 POST 请求访问http://localhost:11434/api/chat/、参数格式为 JSON

  • 案例代码:非流式请求

{
  "model": "qwen:7b",
  "messages": [
    { "role": "user", "content": "大语言模型是什么?" }
  ],
  "stream": false
}
  • 运行结果:
{
	"model": "qwen:7b",
	"created_at": "2025-09-03T08:51:04.6849472Z",
	"message": {
		"role": "assistant",
		"content": "大语言模型是指能够理解和生成大规模文本的AI技术。这类模型通常基于深度神经网络(DNN)、Transformer等架构,通过大量的训练数据来学习语言的规律和模式。\n\n大语言模型的应用广泛,包括但不限于智能写作、机器翻译、问答系统、内容生成等领域。""
	},
	"done_reason": "stop",
	"done": true,
	"total_duration": 1559727300,
	"load_duration": 60467300,
	"prompt_eval_count": 12,
	"prompt_eval_duration": 215000000,
	"eval_count": 45,
	"eval_duration": 1283000000
}

3.3.7 python 调用

  • 使用 python 代码调用 ollama 部署的模型
3.3.7.1 非流式输出
import json
import requests


# 非流式对话
def chat_no_stream(input):  # input的值来自于调用这个函数的时候传的参数
    prompt = {
        "model": "deepseek-r1:1.5b",
        "messages": [
            {"role": "system", "content": "你是一个专业的助手,请认真回答用户的问题"},
            {"role": "user", "content": input},
        ],
        "stream": False
    }
    response = requests.post(url='http://localhost:11434/api/chat', json=prompt)

    # 请求结果数据
    data = response.json()
    # 获取content
    content = data.get('message').get('content')
    # 获取</think>标签的起始索引值
    index = content.find('</think>')
    # 截取content字符内容,从</think>+8开始,前面的内容都是思考部分,我们不输出,只要后面的结果部分 .replace("\n\n", "")
    content = content[index + 8:-1]
    return content
3.3.7.2 流式输出
import json
import requests


def chat_stream(input):
    prompt = {
        "model": "qwen3:1.7b",
        "messages": [
            {"role": "system", "content": "你是一个专业的助手,请认真回答用户的问题"},
            {"role": "user", "content": input},
        ],
        "stream": True
    }
    response = requests.post(url='http://localhost:11434/api/chat', json=prompt, stream=True)
    for chunk in response.iter_lines():
        if chunk:
            data = json.loads(chunk.decode('utf-8'))['message']['content']
            if data:
                yield f"data: {data}\n\n"
    yield "data: [DONE]\n\n"

3.4 vLLM

image-20250618210556449

3.4.1 介绍

  • 官方:【 https://docs.vllm.ai/en/latest/index.html 】

  • vLLM(virtual LLM)是一个高性能、易用的 大语言模型推理与服务框架,最初由 UC Berkeley 等机构提出。它的目标是让大语言模型(LLM)推理更快、更高效,并支持生产环境中的部署

  • vLLM 支持高吞吐、多请求、低延迟、KV 缓存高效复用等关键优化,支持 OpenAI API 接口,兼容多种模型格式

  • KV Cache 就是:把 Transformer 已经算过的 Key/Value 存起来,避免每一步重复计算,从而大幅加速文本生成

3.4.2 核心优势

优势 描述
PagedAttention 用于优化 KV cache 的内存管理,使多个请求共享同一模型时不浪费显存(是 vLLM 的核心)
高吞吐 比 Hugging Face Transformers 快 24 倍
OpenAI API 兼容 可以直接使用 openai.ChatCompletion.create() 方式调用
多模型支持 支持 LLaMA、Qwen 等
高并发多请求调度 类似调度器一样批处理多个用户请求,减少显卡空闲时间
可部署为 API 服务 用 FastAPI 或 CLI 模式部署

3.4.3 PagedAttention

  • 传统 Transformer 在推理时会将历史的 K、V 缓存在 GPU 上的 KV Cache 中。但多个请求可能生成不同长度的序列,很容易导致 显存碎片化(fragmentation),从而浪费大量显存,vLLM 提出的 PagedAttention 机制解决了这个问题:

    • 将 KV 缓存拆成“页”(类似操作系统分页)

    • 用页表管理不同请求的缓存

    • 实现内存复用和压缩管理,大幅提升多并发效率

    • 就像虚拟内存管理一样,PagedAttention 就是“大模型推理的虚拟内存系统”

3.4.4 vLLM 安装

  • 通常会在虚拟机或物理机里用 Docker 部署,方便扩展和管理
  • Docker 安装:虚拟机方式、window 方式
3.4.4.1 安装 Docker Desktop
  • 下载安装包:【 https://www.docker.com/products/docker-desktop/ 】

  • 安装时记得勾选:

    • Enable WSL2
    • 安装默认的 Ubuntu 子系统(Docker 会帮你自动装好)
  • 安装完成后,重启电脑,并确保可以在终端执行:

docker --version
3.4.4.2 加速器地址
  • 常用免费加速器(注册账号后可获得专属加速器地址):可能有的支持有问题,网速可以就不配
服务商 网址
阿里云 https://cr.console.aliyun.com
网易云 https://cloud.163.com/
腾讯云 https://cloud.tencent.com/product/tcr
  • 打开 Docker Desktop 设置

  • 启动 Docker Desktop

  • 点击右上齿轮图标打开 Settings(设置)

  • 选择 Docker Engine 标签页(编辑JSON配置)

  • 修改 registry-mirrors 配置

{
  "registry-mirrors": [
    "https://<你的加速器地址>"
  ]
}
3.4.4.3 安装 Ubuntu
  • 安装了之后,去 docker-desktop 设置一下,就可以用 linux 系统命令方式来操作 docker
wsl --install -d Ubuntu
3.4.4.4 进入 root 用户
  • 在 Ubuntu 操作 docker,需要 root 身份
sudo -i
3.4.4.5 测试

image-20250903220325481

3.4.4.6 检查GPU支持
# 拉取 CUDA 镜像
docker pull nvidia/cuda:13.0.0-cudnn-devel-ubuntu22.04
# 运行容器 + 测试 GPU
docker run --gpus all nvidia/cuda:13.0.0-cudnn-devel-ubuntu22.04 nvidia-smi
3.4.4.7 拉取并运行 vLLM 镜像
  • docker run 会自动下载 Qwen/Qwen3-0.6B 模型
# 启动一个新的容器,加载 Qwen/Qwen3-0.6B 模型
# 把容器内的 8000 端口映射到宿主机的 8000 端口宿主机就可以通过 http://localhost:8000 来访问容器里跑的服务
docker run --gpus all -p 8000:8000 vllm/vllm-openai --model Qwen/Qwen3-0.6B
# 最多使用 GPU 显存的 80%,默认 0.9
docker run --gpus all -p 8000:8000 vllm/vllm-openai --model Qwen/Qwen3-0.6B --gpu-memory-utilization 0.8

image-20250904191909954

  • 在 localhost:8000/v1 启动 OpenAI 风格的 API 服务

image-20250904192042519

3.4.4.8 测试 vLLM 服务
  • 新开一个终端,测试 API:
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen/Qwen3-0.6B",
    "messages": [{"role": "user", "content": "你好,vLLM 是什么?"}]
  }'

image-20250904192214360

  • 也可以用 Python + OpenAI SDK:
from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="EMPTY"  # 默认不需要 key
)

response = client.chat.completions.create(
    model="Qwen/Qwen3-0.6B",
    messages=[
        {"role": "user", "content": "vLLM 是什么?"}
    ]
)
print(response.choices[0].message.content)

image-20250904192349575

3.4.5 性能对比

  • 在同样显存和模型条件下:
系统 吞吐量(tokens/s) 延迟(平均)
HF Transformers + DeepSpeed 1500 200ms
vLLM 3000~4000 100ms 以下

四、本地部署实战

  • 大模型本地部署是指将大型预训练模型(如GPT、Llama、BERT等)完全部署在用户自有的硬件设备(如服务器、本地计算机)上,而非依赖云端 API 服务
  • 本案例部署的是DeepSeek-R1-Distill-Qwen-1.5B模型

1、特点

  • 私有化:模型和数据完全存储在本地,无需通过互联网传输
  • 自主控制:用户拥有模型的完整权限,可自由修改、训练或调整推理逻辑
  • 离线运行:无需网络连接即可使用模型能力(如生成文本、分析数据)

2、模型下载

  • 从 huggingface 找到你要下载的模型

    image-20250618201852196

  • 安装 huggingface 库:

pip install huggingface_hub
  • 下载模型文件:挂**,有几个 G
# 加速下载设置
set HF_ENDPOINT=https://hf-mirror.com
# 下载模型文件到本地指定目录
hf download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B --local-dir ./deepseek1
  • 下载结果

image-20250904200551050

3、参数详解

  • device

    • 概念:指定模型运行的计算设备(CPU 或 GPU)。在 PyTorch 中通常为 "cpu" 或 "cuda:0"
    • 设置建议:优先使用 GPU(如 device="cuda:0"),显存不足时用 CPU
  • torch_dtype

    • 概念:模型张量的数据类型,如 float32(高精度)、float16、bfloat16(低精度,节省显存)
    • 影响:精度越高(如 float32),结果越精确,但显存占用更大。精度越低(如 float16),显存占用少,但可能损失精度或数值不稳定
    • 设置建议:GPU 推荐 torch.float16 或 bfloat16(兼容性需确认);CPU 通常用 bfloat16
  • max_length

    • 概念:生成文本的最大长度(token 数量)
    • 影响:值越大,生成内容越长,但速度越慢,且可能重复或偏离主题。值过小可能导致回答不完整
    • 设置建议:根据任务调整:对话建议 100-300,长文本生成可设 512-1024,注意模型最大限制(如 4096)
  • do_sample

    • 概念:是否启用采样策略(如 top_k, top_p)。若为 False,则使用贪心解码(确定性强)
    • 影响:True:输出多样化,适合创意任务。False:输出确定性强,适合事实性问题
    • 设置建议:需要多样性时设为 True,需准确性时设为 False
  • top_k

    • 概念:采样时保留概率最高的前 k 个 token

    • 影响:值越大(如 100),候选 token 多,输出多样但可能不相关。值越小(如 10),输出更确定但可能重复

    • 设置建议:通常设为 10-50

    • top_k=3 采样:

      • 只保留概率最高的 3个 token:["猫", "狗", "鸟"]
      • 在这三个中按概率随机采样一个
      Token 概率
      "猫" 0.30
      "狗" 0.25
      "鸟" 0.15
      "跑" 0.10
      "跳" 0.08
      "飞" 0.07
      "叫" 0.05
  • temperature

    Token Logits Softmax(T=1) Softmax(T=0.5) Softmax(T=2)
    "猫" 4.0 0.60 0.80 0.40
    "狗" 3.0 0.25 0.18 0.30
    "鸟" 2.0 0.15 0.02 0.30
    • 概念:控制采样随机性,调整概率分布平滑度
    • 影响:值大(如 1):输出随机性高,可能不连贯。值小(如 0.1):输出更确定,但易重复
    • 设置建议:平衡点常为 0.7-1.0;需创造性时调高(如 0.9),需保守时调低(如 0.3)
  • top_p

    • 概念:从累积概率超过阈值 p 的最小 token 集合中采样

    • 影响:值大(如 0.95):候选 token 多,输出多样。值小(如 0.5):候选 token 少,输出更集中

    • 设置建议:常用 0.7-0.95

      Token 概率 累积和
      "猫" 0.25 0.25
      "狗" 0.20 0.45
      "鸟" 0.15 0.60
      "跑" 0.12 0.72
      "跳" 0.10 0.82
      "飞" 0.09 0.91 : 达到 top_p 阈值
      "叫" 0.05 0.96
  • repetition_penalty

    if token in generated_tokens:
        logits[token] /= repetition_penalty
    
    • 概念:惩罚重复 token 的权重(>1.0 时抑制重复,<1.0 时鼓励重复)

    • 影响:值大(如 2.0):减少重复,但可能生成不自然内容。值小(如 1.0):无惩罚,默认行为

    • 设置建议:通常设为 1.0-1.2,明显重复时可设 1.2-1.5

    应用场景 推荐设置
    正常文本生成(如聊天) 1.1~1.3(防止重复)
    模仿风格性强文本(如古诗) 1.0(或略小)
    模型不断重复一句话? 适当增大 penalty(如 1.5)

4、本地模型

4.1 非流式推理

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

# 加载模型
model_path = "../deepseek"
# 指定设备
device = "cuda:0" if torch.cuda.is_available() else "cpu"
# 指定模型参数类型为 float16
torch_dtype = torch.float16
# 加载模型并移动到 GPU
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch_dtype).to(
    device
)
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(model_path)

# 设置生成参数和输入消息
gen_kwargs = {
    "max_length": 1024,  # 生成的最大长度
    "do_sample": True,  # 是否使用概率采样
    "top_k": 10,  # 采样时的前K个候选词,越大越随机
    "temperature": 0.7,  # 生成丰富性,越大越有创造力
    "top_p": 0.8,  # 采样时的前P个候选词,越大越随机
    "repetition_penalty": 1.2,  # 重复惩罚系数,越大越不容易重复
}
# 定义消息内容
messages = [
    {"role": "system", "content": "你是AI助手"},
    {"role": "user", "content": "今天天气不错哟"},
]

# 将输入数据转换为模型可接受的格式
inputs = tokenizer.apply_chat_template(
    messages,
    add_generation_prompt=True,
    tokenize=True,
    return_tensors="pt",
    return_dict=True,
).to(
    device
)

# 生成输出
outputs = model.generate(**inputs, **gen_kwargs)  # 生成输出
outputs = outputs[:, inputs["input_ids"].shape[1]:]  # 截取生成的输出
result = tokenizer.decode(outputs[0], skip_special_tokens=True)  # 解码输出

# 打印结果
print(result)

4.2 流式推理

from transformers import AutoTokenizer, AutoModelForCausalLM, TextIteratorStreamer
import torch
from threading import Thread


class DeepSeek:
    def __init__(self, model_path, device, torch_dtype):
        self.device = device  # 设定推理设备
        self.model = AutoModelForCausalLM.from_pretrained(
            model_path, torch_dtype=torch_dtype
        ).to(
            device
        )  # 加载模型并移动到GPU
        self.tokenizer = AutoTokenizer.from_pretrained(model_path)  # 加载分词器

    def inference(self, messages, gen_kwargs):
        inputs = self.tokenizer.apply_chat_template(
            messages,
            add_generation_prompt=True,
            tokenize=True,
            return_tensors="pt",
            return_dict=True,
        ).to(
            self.device
        )  # 将输入数据移动到GPU
        streamer = TextIteratorStreamer(
            self.tokenizer, skip_special_tokens=True
        )  # 创建流式输出对象
        generation_kwargs = dict(**inputs, **gen_kwargs, streamer=streamer)  # 生成参数
        thread = Thread(
            target=self.model.generate, kwargs=generation_kwargs
        )  # 创建线程
        thread.start()  # 启动线程进行生成
        generated_text = ""  # 初始化生成文本
        for new_text in streamer:  # 流式输出生成的文本
            generated_text += new_text  # 累加生成的文本
            yield new_text  # 逐步返回生成的文本


if __name__ == "__main__":
    # 设定模型路径和设备,加载模型
    model_path = "../deepseek"
    device = "cuda:0" if torch.cuda.is_available() else "cpu"
    torch_dtype = torch.float16
    deepseek = DeepSeek(model_path, device, torch_dtype)

    # 设定推理参数,推理消息
    gen_kwargs = {
        "max_length": 1024,  # 生成的最大长度
        "do_sample": True,  # 是否使用概率采样
        "top_k": 10,  # 采样时的前K个候选词,越大越随机
        "temperature": 0.7,  # 生成丰富性,越大越有创造力
        "top_p": 0.8,  # 采样时的前P个候选词,越大越随机
        "repetition_penalty": 1.2,
    }  # 重复惩罚系数,越大越不容易重复
    messages = [
        {"role": "system", "content": "你是一名乐于助人的人工智能助手"},
        {"role": "user", "content": "请简要介绍一下你自己"},
    ]  # 定义消息内容
    response = deepseek.inference(messages, gen_kwargs)  # 调用推理方法
    result = ""  # 初始化结果
    for chunk in response:  # 流式输出生成的文本
        result += chunk  # 累加生成的文本
        print(result)  # 打印结果

5、ollama 部署

  • 上面已经讲解

6、vLLM 部署

  • 上面已经讲解调用,这里细分一下非流式输出和流式输出

6.1 非流式输出

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="EMPTY"  # 默认不需要 key
)

response = client.chat.completions.create(
    model="Qwen/Qwen3-0.6B",
    messages=[
        {"role": "user", "content": "vLLM 是什么?"}
    ]
)
print(response.choices[0].message.content)

6.2 流式输出

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="EMPTY"  # 默认不需要 key
)

response = client.chat.completions.create(
    model="Qwen/Qwen3-0.6B",
    messages=[
        {"role": "user", "content": "hello"}
    ],
    stream=True,
)

result = []
for chunk in response:
    result.append(chunk.choices[0].delta.content)
    print(chunk.choices[0].delta.content, end="")
print()
print(result)