微调后的 LLM 如何部署到生产环境?从GPU 推理端点的搭建、测试与上线全流程

想象一下这样一个产品团队:他们针对临床病历(Clinical Notes)对一个大语言模型进行了微调。在实验室测试中,提示词和模型生成的回答看起来都棒极了。然而,紧接着有人提出了一个棘手的问题:我们如何在不将受保护健康信息(PHI)暴露给共享公共 API 的前提下,把这个模型安全地接入面向患者的移动应用中?

这种理想与现实的鸿沟无处不在,并不仅限于医疗科技(Healthtech)领域。你可能也正在开发:

  • 一个基于企业内部运行手册(Runbooks)训练的知识库支持机器人。
  • 一个根据你们公司的合同风格进行了微调的法务助手。
  • 一个适配了企业私有代码库规范的 AI 编程助手。

模型训练的最终产物只是一个包含权重(Weights)的文件夹。而生产环境需要的是完全不同的基础设施:一个稳定的 URL 链接、在面对大量用户并发请求时依然可预测的低延迟,以及能够将所有流量严格锁定在云内网络边界的安全策略。

如果您希望快速调用基础模型并按 Token 用量付费,DigitalOcean 的**Serverless(无服务器)推理**是一个极佳的选择。但在这类共享端点上,您无法直接上传和托管自己微调的专属模型权重。

专用推理(Dedicated Inference)则能为您提供为该模型独占的预留 GPU 资源。而 BYOM(自带模型,Bring Your Own Model) 则是您将这些微调权重注册到 DigitalOcean 模型目录(Model Catalog)中的核心桥梁,让平台能够精准识别并加载您的专属模型。

首先,让我们来厘清何时该选择专用推理,何时又该选择其他架构。

何时使用专用推理(以及何时不使用)?

当您需要对提供服务的模型拥有绝对控制权(例如:您自己微调的权重、私有专有模型,或默认模型目录中未提供的任何架构),并且您预期用户或应用程序会以持续、稳定的生产级流量访问该端点时,使用专用推理(Dedicated Inference)是最合理的方案。

在专用推理模式下,您的模型将运行在完全独占的预留 GPU 实例上,隐藏在您的私有网络(VPC)内部的私有端点(Private Endpoint)之后。这意味着您将获得始终如一的稳定延迟、彻底的网络隔离,以及灵活应用自定义访问控制策略的能力。

对于高度重视数据隐私、合规性、可预测性能,或者需要运行无法在 Serverless 模式下作为标准基础模型提供的自定义模型的企业来说,这是完美的解法。不过这也伴随着一种权衡:只要该部署存在,您就需要为这块专属的预留 GPU 按小时付费,即使在某些时段请求非常稀疏。

专用推理是完美的解法 建议尝试其他替代方案
拥有微调或完全自定义的模型权重 仅使用官方标准目录模型 →\rightarrow Serverless 推理
流量稳定;能够接受按 GPU 小时数付费 流量呈断崖式突发或规模极小 →\rightarrow Serverless 推理(按 Token 计费,无 GPU 闲置账单)
有私有 GPU、VPC 端点或严苛的合规需求 仅进行快速测试,无需自定义权重
用于实时的生产环境 API 或在线聊天 运行不紧急的通宵海量批处理任务 →\rightarrow 批处理推理(Batch Inference)

您可以进一步阅读了解 Serverless、Dedicated 与 Batch 推理之间的深度区别 以及 专用推理与无服务器推理在规模化扩展时的权衡

前提条件

在正式开始之前,请确保您已准备好以下资源:

  1. 一个 DigitalOcean 账户。中国区的DigitalOcean新注册用户如果遇到使用问题,可直接联系卓普云(aidroplet.com)技术团队。
  2. 激活专用推理(Dedicated Inference)与 BYOM 权限。
  3. ATL1NYC2TOR1RIC1 区域中拥有一个 VPC(私有网络) ,并在该 VPC 内拥有一台 Droplet(云服务器),用于执行步骤 4 的连通性测试。
  4. 已将模型权重存储在 Spaces(对象存储)Hugging Face 中(请参考 BYOM 限制规范)。
  5. 可选配置 :用于执行微调训练的 GPU Droplet;以及用于在生产环境中锁紧访问权限的云防火墙(Cloud Firewalls)。

区域选择小提示 :建议尽可能将模型导入(Import)首选项VPC 网络 和推理部署(Deployment)保持在同一个物理区域(Region)内。虽然跨区域部署完全可行,但在刚部署完成后,由于数据同步和 GPU 初始化需要跨地域对齐,最初的几次请求可能会暴露出明显的延迟(冷启动感)。

核心技术词汇速查表

技术术语 通俗理解
微调 (Fine-tuning) 通过大量的示例样本对,教导一个基础大模型学会你们行业的专业术语、语气风格或特定领域的知识库。
权重 / 检查点 (Weights / Checkpoint) 训练结束后保存下来的二进制文件,它们代表了模型最终"学会"的记忆和知识。
BYOM (自带模型) 将您本地或第三方的模型权重无缝上传/注册到 DigitalOcean 模型目录的过程。
专用推理 (Dedicated Inference) 一个全托管的、由独占 GPU 驱动的 API 端点,专门用来为您导入的专属模型提供算力。
VPC (私有网络) 一个完全隔离的私有网络切片。只有处于该 VPC 内部的云资源才能轻松地相互访问。
私有端点 (Private Endpoint) 一个专有的推理 API 链接(URL),它在设计上只能从该 VPC 的内部进行调用。
OpenAI 兼容 API 与 OpenAI 的 chat/completions 拥有完全相同的 JSON 报文结构,这意味着市面上绝大多数开源 AI SDK 都可以直接无缝切换过来。

最终构建的拓扑架构

rust 复制代码
[可选] GPU Droplet          Hugging Face 或 Spaces
          |                               |
          v                               v
    微调后的模型权重  --------->  BYOM 导入 (My Models 目录)
                                          |
                                          v
    VPC内的应用程序   ------------>  专用推理 (VPC内部私有URL)

通过完成本教程,您将获得:

  • 一个在 My Models 下注册成功、且状态显示为 Ready(就绪)的自定义模型。
  • 一个状态显示为 Active(激活)的专用推理(Dedicated Inference)独立部署。
  • 一条从您的私有 VPC 内部发起并成功返回的 API 测试响应。
  • 一套可以直接复用到真实生产环境应用后端的标准化架构范式。

如何高效利用本教程

  • 请务必先在实验项目(Lab Project)或沙箱测试账户中进行演练。
  • 顺手建立一个简单的笔记文件,记录好:您指定的模型名称、部署区域、公共端点是否开启、以及您的访问令牌(Access Token)的存放位置。
  • 切勿跳过步骤 4 的测试环节。这是在您将前端应用正式对接到后端之前,证明模型服务已在私有云网络内正常运转的唯一铁证。
  • 如果您已经在 Hugging Face 上准备好了现成的微调模型文件夹,请直接从步骤 2 开始阅读。

五大步骤一览

步骤 核心目标 控制面板(Control Panel)操作路径
1 构建您的自定义模型权重(可选) 创建并登录 GPU Droplet
2 在模型目录中注册并导入权重 INFERENCE →\rightarrow Model Catalog →\rightarrow My Models
3 将模型文件一键转化为常驻 GPU API 端点 INFERENCE →\rightarrow Dedicated Inference
4 在您的私有 VPC 内部验证端点响应 进入部署的 Overview 页面 →\rightarrow → 获取 curl 脚本进行测试
5 评估模型质量、合规性与性能指标 查看 Model EvaluationsObservability 及配置项

步骤 1:在 GPU Droplet 上进行模型微调(可选)

直接从互联网下载的基础模型往往只能说一些通用的场面话。要让它真正为您的业务出力,它必须学会符合您用户群体的专业词汇、安全边界和特定的回答格式。监督微调(SFT, Supervised Fine-Tuning)是达成这一目标的最常用手段:通过向模型展示成千上万组高质量的"输入-输出"示例,促使其底层的神经网络参数(权重)进行精准对齐。

如果您的算法团队已经把打包好的 Hugging Face 模型文件夹交到了您手上,请直接跳到步骤 2。您完全不需要重复训练。

您将在控制面板中执行的操作:

  1. 在您稍后计划部署推理的同一个区域中,创建一台 GPU Droplet
  2. 通过 SSH 登录进去,安装 Python 环境与深度学习加速工具链,然后启动训练。
  3. 训练完成后,保存为标准的 Hugging Face 格式目录并上传到对象存储或 Hub。

准备精简的训练数据集

许多初学者会选择公开的医疗问答数据集来跑通整套技术流水线。请务必注意:切勿在教程实验中上传真实的患者隐私数据(PHI)。 到了生产环境实战时,必须先进行严格的脱敏与去标识化(Anonymization)处理。

我们将编写一个 Python 脚本,用于加载和预处理微调所需的样本数据。

  1. 在您的 GPU Droplet 上创建一个名为 prepare_dataset.py 的新 Python 文件,并写入以下代码:
python 复制代码
# 如果报错 "ModuleNotFoundError: No module named 'datasets'",
# 说明您需要先安装 'datasets' 库。
# 在终端中执行:pip install datasets

from datasets import load_dataset

# 加载一个公开的演示数据集。
# 到了生产环境,您可以将其替换为本地的 CSV 或 JSON 文件路径。
dataset = load_dataset("FreedomIntelligence/medical-o1-reasoning-SFT", "en")

def preprocess_function(example):
    # "prompt" 代表用户的提问;"completion" 代表最完美的标准答案。
    return {
        "prompt": [{"role": "user", "content": example["Question"]}],
        "completion": [
            {
                "role": "assistant",
                "content": (
                    f"<thinking>{example['Complex_CoT']}</thinking>"
                    f"{example['Response']}"
                ),
            }
        ],
    }

# 对数据集中的每一行数据应用上述清洗与转换函数
processed_dataset = dataset.map(
    preprocess_function,
    remove_columns=["Question", "Response", "Complex_CoT"],
)

# 将清洗完成的数据持久化保存到本地磁盘中
processed_dataset.save_to_disk("./processed_medical_chat")
print("预处理数据集已成功保存至:./processed_medical_chat")
  1. 运行该脚本:

    python prepare_dataset.py

  • 预期输出预处理数据集已成功保存至:./processed_medical_chat

这将在您的当前工作目录下创建 processed_medical_chat 文件夹,在下一步中,我们将让训练器直接指向这个目录。

关键点提示

  • load_dataset 能够极大地简化远程开源数据的抓取,省去了初学者手动拼接大规模 JSON 格式的痛苦。
  • promptcompletion 的键名设计完全符合 TRL 库中 SFTTrainer 所期待的规范标准。
  • 代码中的 <thinking>...</thinking> 标签仅作为一种训练模型展现思维链(CoT, Chain-of-Thought)的风格示例。您可以根据具体业务场景或内容安全合规指南自由删除或修改它。

在 Droplet 上安装微调加速工具链

在 GPU Droplet 上,安装 PyTorch 时必须显式指定与当前系统内 NVIDIA 显卡驱动版本完全匹配的 CUDA 版本 。直接运行简单的 pip install torch 往往会下载一个使用了最新 CUDA 编译的通用包,这极易导致显卡驱动不向下兼容,使得 torch.cuda.is_available() 尴尬地返回 False,从而彻底搞砸大模型高效率的 bf16 混合精度训练。

  1. 首先检查 GPU 硬件状态与系统驱动:

    nvidia-smi

您应该能清晰地看到显卡型号(如 NVIDIA H100/H200)和驱动版本号。如果该命令报错失败,请优先检查您的镜像底座或联系支持重新挂载 GPU------因为在 CPU 上训练一个 8B(80亿参数)规模的模型在实际工程中是完全不可行的。

  1. 精准安装兼容 CUDA 12.1 的 PyTorch 及核心机器学习库:
perl 复制代码
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install transformers datasets trl accelerate peft bitsandbytes "jinja2>=3.1.0"

注意 :这里强制要求 "jinja2>=3.1.0"。这是因为 Hugging Face 的 SFTTrainer 在使用 apply_chat_template 对多轮对话行进行 Tokenize 编码时,底层极其依赖新版 Jinja2 的新特性。许多旧版 Linux 镜像默认集成了 3.0.x 版本,会直接触发 ImportError 崩溃。

如果 cu121 依然弹出关于驱动不兼容的警告,您可以尝试从同一个 index URL 安装兼容旧版驱动的 cu118;或者在创建 Droplet 云服务器时,直接选用 DigitalOcean 官方提供的 AI/ML GPU 镜像 (即集成了 Jupyter 运行环境的 GPU Droplets)------这类官方镜像在出厂时通常就已经深度预装并完美匹配好了底层显卡驱动与 CUDA 工具链技术栈。

  1. 确认 PyTorch 已正确接管并激活了您的 GPU 算力:
less 复制代码
python -c "import torch; print('cuda:', torch.cuda.is_available()); print('设备名称:', torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'none')"
  • 预期输出

    vbnet 复制代码
    cuda: True
    device: NVIDIA H200

只有当输出显示 cuda: True 时,您才可以继续运行接下来的训练脚本。如果显示 False,请立即停下重装 PyTorch 或修复 CUDA 驱动环境。

  1. 验证 Jinja2 版本是否过关:
scss 复制代码
python -c "import jinja2; print(jinja2.__version__)"

如果版本低于 3.1.0,请执行强制升级:pip install --upgrade "jinja2>=3.1.0"

核心库分工说明:

  • torch:在 GPU 核心上执行底层的矩阵张量数学运算。
  • transformers:负责加载大模型顶层的标准神经网络骨干架构。
  • trl:提供了极其强悍的 SFTTrainer 抽象,帮开发者隐藏了成百上千行枯燥的独占算力微调样板代码。
  • accelerate / peft:提供高效的参数高效微调(如 LoRA/QLoRA)及多卡分布式加速调度支持。
  • jinja2:在数据清洗阶段,负责将人类可读的提示词列表完美渲染为大模型看得懂的 Chat Template 格式。
  1. 在 Droplet 上创建一个新的 Python 文件:

将以下代码保存为 train_model.py,并确保它与您运行 prepare_dataset.py 的目录在同一级(这样才能正确解析指向数据集文件夹的相对路径)。

python 复制代码
# 在确认满足以下条件后,在您的 GPU Droplet 上运行此脚本:
#   - CUDA 可用(torch.cuda.is_available() 返回 True)
#   - 已安装 jinja2 >= 3.1.0

import sys
import torch
from datasets import load_from_disk
from trl import SFTConfig, SFTTrainer

# 由 prepare_dataset.py 生成的预处理数据集的路径
PROCESSED_DATA_DIR = "./processed_medical_chat"
# 微调后的模型权重将保存到的输出目录
OUTPUT_DIR = "./my-fine-tuned-model"
# 来自 Hugging Face Hub 的基础模型(对于受限模型可能需要身份验证)
BASE_MODEL = "Qwen/Qwen2.5-1.5B-Instruct"

# 检查 GPU 是否可用
if not torch.cuda.is_available():
    sys.exit(
        "CUDA 不可用。请运行:python -c \"import torch; print(torch.cuda.is_available())\"\n"
        "如果返回 False,请重新安装合适版本的 PyTorch,或修复您的 GPU 驱动。"
    )

# 根据您的 GPU 自动探测最佳的精度设置
use_bf16 = torch.cuda.is_bf16_supported()
use_fp16 = not use_bf16 and torch.cuda.get_device_capability(0)[0] >= 7
print(f"正在启动训练。精度模式:bf16={use_bf16}, fp16={use_fp16}")

# 加载预处理后的数据集
dataset = load_from_disk(PROCESSED_DATA_DIR)
train_dataset = dataset["train"] if "train" in dataset else dataset

# 使用 TRL SFTTrainer 配置监督微调
trainer = SFTTrainer(
    model=BASE_MODEL,
    train_dataset=train_dataset,
    args=SFTConfig(
        output_dir=OUTPUT_DIR,
        num_train_epochs=1,
        per_device_train_batch_size=1,
        gradient_accumulation_steps=4,
        learning_rate=2e-5,
        logging_steps=10,
        save_steps=500,
        bf16=use_bf16,
        fp16=use_fp16,
    ),
)

trainer.train()
trainer.save_model(OUTPUT_DIR)
print(f"微调权重已成功保存至 {OUTPUT_DIR}")

该脚本的核心逻辑如下:

  • 检查是否存在兼容的 NVIDIA GPU,如果不存在则退出并给出操作指引。
  • 探测 GPU 是否支持高效的混合精度训练(bf16 或 fp16),并据此设置训练标志。
  • 从磁盘加载您预处理好的训练数据。
  • 使用 Hugging Face 的 TRL SFTTrainer,在您的自定义数据集上微调基础大语言模型(Qwen/Qwen2.5-1.5B-Instruct)。
  • 配置基础训练参数:1 个 Epoch、批次大小(Batch Size)为 1、梯度累积、以及定期的模型检查点与日志记录。
  • 训练模型并将最终生成的微调权重保存到 ./my-fine-tuned-model 目录中,随时用于推理和 BYOM 部署。
  • 进程结束且输出文件夹准备就绪时,在控制台打印确认信息。
  1. 运行脚本:

如果您使用的是受限的基础模型,请先确认 Hugging Face 的身份验证状态(运行 huggingface-cli whoami)。如果之前由于 Jinja2 错误导致分词(Tokenization)失败,请先运行 pip install --upgrade "jinja2>=3.1.0"。然后执行:

复制代码
python train_model.py

根据 GPU 的规格、模型体量以及 Epoch 轮数的不同,微调训练可能会消耗较长的时间。如果运行状态健康,您应该能在控制台看到每一步的日志以及处于下降趋势的 Loss(损失值)。您可以阅读更多关于 LLM 微调 的内容。

预期输出

bash 复制代码
...
微调权重已成功保存至 ./my-fine-tuned-model
  1. 确认输出文件夹已存在:
bash 复制代码
ls -la ./my-fine-tuned-model

您应该至少能在目录中看到 config.json、Tokenizer 相关配置文件以及一个或多个 .safetensors 权重文件。接下来的 BYOM 流程需要导入的正是这个目录,而不是那些 .py 脚本。

注意事项:

  • model= 是源自 Hugging Face 的初始检查点。更大的模型需要更大显存的 GPU;如果遇到显存溢出(OOM)错误,请调小模型规格或采用 QLoRA 架构(本教程未涵盖)。
  • train_dataset 必须是由 prepare_dataset.py 生成的预处理数据。如果您跳过了该步骤,请将 load_from_disk(...) 替换为您自己的 load_dataset(...) 调用,并确保其符合相同的 prompt / completion 格式。
  • 在开展完整的训练任务之前,建议参考 TRL SFTTrainer 的官方指南并在您的 Droplet 上进行简短的测试运行,以此来微调 num_train_epochsper_device_train_batch_sizelearning_rate
  • save_model 会写入您将在下一节中需要上传的整个文件夹。请在训练过程中密切监测 Loss 曲线;如果 Loss 停滞不前或发生梯度爆炸,请务必先修复训练问题,以免盲目为推理 GPU 支付不必要的成本。

BYOM 支持接收的导出文件格式

您的本地文件夹在布局上应该等同于一个标准的 Hugging Face 仓库:

  • config.json(包含模型架构与超参数)
  • Tokenizer 配置文件,例如 tokenizer.jsontokenizer_config.json
  • Safetensors 格式的权重文件(.safetensors

您可以查阅 BYOM 限制规范以了解当前支持的模型架构。

训练后的权重上传

上传至 Hugging Face:

bash 复制代码
huggingface-cli upload 您的组织名称/您的模型名称 ./my-fine-tuned-model .
  • 您的组织名称/您的模型名称 将成为您在步骤 2中粘贴到 BYOM 界面中的仓库 ID(Repo ID)。
  • ./my-fine-tuned-model 是由 save_model 创建的本地保存目录。
  • 末尾的 . 很重要,它代表直接上传该文件夹内部的资产,而不是将外层文件夹本身作为一个单独的文件上传。

上传至 Spaces :您可以使用控制面板的可视化上传 UI,或者使用 s3cmd 命令行客户端配合您的 Spaces 端点 URL,将相同的目录同步到 Spaces 存储桶的指定前缀下。

步骤 2:利用 BYOM 将模型无缝导入云端

为什么这一步很重要?

DigitalOcean 的专用推理集群为了确保极致的安全与零信任隐私合规,绝不会随随便便去读取您本地电脑上的散落文件。BYOM(自带模型)扮演了严苛的网络交接人角色 :云平台会主动将您的模型权重拉取到完全隔离的托管存储区域,进行深度的格式与架构合法性校验,验证通过后将其归类展示在 My Models 专属目录中。只有走完这套审查流程,该模型才具备绑定到生产级物理 GPU 节点的资格。

这就像机场的安检闸机,它会在资产触碰任何生产环境 GPU 算力之前,对文件结构、底座架构及 Tokenizer 连通性进行全方位扫描。

网页控制面板操作路径:

INFERENCE →\rightarrow Model Catalog →\rightarrow My Models →\rightarrow Import Model

  1. 选择您的数据源头:Hugging FaceDigitalOcean Spaces
  2. 填写模型名称、详细描述、分类标签,并设定首选的 GPU 物理服务区域
  3. 如果您的 Hugging Face 仓库设置了私有或门槛访问(Gated Repo),请在此处填入有效的 Read 权限 Access Token。
  4. 勾选同意合规条款,点击确认。

随后,您可以在列表中直观地跟踪模型的审核状态:

模型状态 背后含义 您需要做的配合
Importing 云端正在全速进行文件的跨网络拉取与安全性合法校验。 耐心等待。百亿参数的大模型由于文件体量巨大,需要消耗更多同步时间。
Ready 资产审查与格式对齐圆满完成。 恭喜!请立刻无缝推进到 步骤 3
Failed 文件夹结构残缺、不满足支持的底层架构、或者授权 Token 校验失败。 展开详细错误日志,修复对应的配置文件或访问权限,重新发起导入。

步骤 3:一键部署专用推理(Dedicated Inference)

模型成功导入仅仅代表云平台知道了"要提供什么服务";而部署(Deploy)则是向数据中心真正申请物理硬件资产的过程------它会为您从硬件池中切割出专属的 GPU 类型、编织 VPC 私有网络、架设网关路由,并配置全自动扩缩容挂钩。

专用推理最适合应对长期的、高生产力且流量平稳的专属业务。部署一旦激活,只要没有执行销毁,您就需要持续为这块独占的 GPU 算力按小时支付租赁费用,这与按 Token 消耗计费的 Serverless 共享池形成了鲜明的对比。

网页控制面板操作路径:

INFERENCE →\rightarrow Dedicated Inference →\rightarrow Deploy Dedicated Inference

  1. Region(区域):强烈建议与您应用程序所在的 VPC 私有网络保持在绝对相同的地理区域。
  2. Model 标签页 :果断切换到 My Models,从下拉列表中勾选您在步骤 2 中成功导入的微调模型。
  3. GPU 硬件规划:针对体量较小的模型(如 7B--8B 级别的轻量级大模型),直接单卡(1 GPU)开局即可。后续如果并发飙升或模型本身极为庞大,可在控制面板中一键横向扩展或纵向升级。
  4. Deployment Name :指定一个见名知意的生产级规范名称,例如:clinical-notes-prod-v1
  5. Public Endpoint(公共端点) :如果你们行业有极严苛的合规数据隐私限制,请果断保持在"Disabled"(禁用)状态,从而将流量彻底锁死在内网环境中。
  6. 点击部署,观察实时进度。

通常在 15 到 30 分钟内,随着底座容器拉取并挂载 GPU 显存成功,部署状态会平稳切入到绿色的 Active(激活) 状态。

您将看到的部署状态迁移:

  • Provisioning(配置中):底座物理 GPU 资源正在切分,内网私有路由正开道拓荒,请稍作等待。
  • Active(活跃中):系统已进入备战状态,完全可以安全、顺畅地承接内网测试流量。
  • Error(错误):多半是由于当前区域特定显卡库存紧张,或模型内部发生了显存溢出(OOM)。可随时查看错误弹窗,尝试更换 GPU 显存规格或切换到另一服务区域。

⚠️ 安全预警:

控制面板仅会在部署创建成功的那一瞬间,在网页前端向您展示唯一一次端点访问令牌(Endpoint Access Token)。请务必第一时间将其保存到企业级密码管理器或机密保管库中!一旦不慎遗失,您将无法找回,只能前往部署的 Settings 页面重新生成一组全新的访问密钥。

步骤 4:在私有 VPC 网络内部测试端点连通性

亮起绿色的 Active 徽章固然让人欣喜,但在工程落地中,我们必须通过一次真正的 HTTP 报文请求,亲眼看到模型吐出正确的文本响应才算过关。同时,这一步能帮您深刻理解一条铁律:私有端点(Private Endpoint)在设计上只能被处于同一个 VPC 私有网络内部的云资源(如 Droplet、Kubernetes 节点)所访问,您坐在家里的个人笔记本电脑上直接连是绝对无法连通的(除非您架设了专用的 VPN 隧道或堡垒机)。

这种对公网彻底"隐形"的隔离架构,正是医疗科技、金融科技团队强调"核心隐私数据绝不能踏出内网边界"时所梦寐以求的防护体系。

从部署 Overview(概览)页面收集核心机密

请打开您刚刚创建成功的部署概览页,顺手复制并保存以下四项关键参数:

  1. Private Endpoint URL (一串以 https:// 开头,以类似 private-dedicated-inference.do-infra.ai 结尾的内网专用链接)。
  2. CA 根证书文件(点击网页上的 Download 按钮,将其下载到本地并传输到测试机上)。
  3. 模型名称(必须与您在 BYOM 中注册的拼写及大小写完全一致)。
  4. 刚刚在创建时保存的端点访问令牌

请在同一个 VPC 内的 Droplet、Kubernetes 节点或其他虚拟机(VM)上运行此测试。许多团队会专门保留一台精炼的"跳板(Jump)"Droplet 来进行此类网络连通性检查。

测试请求逐行解析

vbnet 复制代码
curl --cacert /path/to/ca.pem \
  --location "https://YOUR-PRIVATE-ENDPOINT/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_ENDPOINT_ACCESS_TOKEN" \
  -d '{
    "model": "YOUR_MODEL_NAME",
    "messages": [
      {"role": "user", "content": "Say hello in one sentence."}
    ],
    "max_tokens": 150
  }'

预期输出示例如下:

ruby 复制代码
{"id":"chatcmpl-00d342fa-748d-4fd6-9368-a26e0899ec32","object":"chat.completion","created":1779880993,"model":"anish-byom-qwen3-4b-tutorial","choices":[{"index":0,"message":{"role":"assistant","content":"Hello! 😊","refusal":null,"annotations":null,"audio":null,"function_call":null,"tool_calls":[],"reasoning":null},"logprobs":null,"finish_reason":"stop","stop_reason":null,"token_ids":null}],"service_tier":null,"system_fingerprint":null,"usage":{"prompt_tokens":14,"total_tokens":19,"completion_tokens":5,"prompt_tokens_details":null},"prompt_logprobs":null,"prompt_token_ids":null,"kv_transfer_params":null}%

您也可以配合 jq 命令让输出的 JSON 报文更具可读性(美化输出):

vbnet 复制代码
curl --cacert /path/to/ca.pem \
  --location "https://YOUR-PRIVATE-ENDPOINT/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_ENDPOINT_ACCESS_TOKEN" \
  -d '{
    "model": "YOUR_MODEL_NAME",
    "messages": [
      {"role": "user", "content": "Say hello in one sentence."}
    ],
    "max_tokens": 150
  }' | jq .
sql 复制代码
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   774    0   613  100   161   1521    399 --:--:-- --:--:-- --:--:--  1925
{
  "id": "chatcmpl-b8175ac2-c4f0-444e-a69d-c2066d0a3a99",
  "object": "chat.completion",
  "created": 1779881059,
  "model": "anish-byom-qwen3-4b-tutorial",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Hello! 😊",
        "refusal": null,
        "annotations": null,
        "audio": null,
        "function_call": null,
        "tool_calls": [],
        "reasoning": null
      },
      "logprobs": null,
      "finish_reason": "stop",
      "stop_reason": null,
      "token_ids": null
    }
  ],
  "service_tier": null,
  "system_fingerprint": null,
  "usage": {
    "prompt_tokens": 14,
    "total_tokens": 19,
    "completion_tokens": 5,
    "prompt_tokens_details": null
  },
  "prompt_logprobs": null,
  "prompt_token_ids": null,
  "kv_transfer_params": null
}

核心命令与参数分工

代码片段 具体职责
curl 从命令行发送 HTTP 请求。非常适合在编写正式应用程序代码前进行初步的连通性验证。
--cacert /path/to/ca.pem 信任 DigitalOcean 为该部署独立颁发的私有 TLS 证书。如果不配置此项,TLS 握手校验将会失败。
--location "https://.../v1/chat/completions" 请求 OpenAI 风格的对话路径,您的主流 SDK 也可以直接复用该路径。
Authorization: Bearer ... 向推理集群网关证明当前客户端拥有合法的调用特权。
"model": "YOUR_MODEL_NAME" 必须完美对应您在 BYOM 中注册的模型导入别名,它不一定等同于 Hugging Face 仓库的原始名称。
messages 对话历史记录数组。对于初期的冒烟测试,单条用户消息(user message)就足够了。
max_tokens 限制模型回答的内容长度上限,以便让测试过程中的资源消耗和成本完全可预测。

让我们尝试运行另一条 curl 命令来测试模型的问答响应:

vbnet 复制代码
curl --cacert /path/to/ca.pem \
  --location "https://YOUR-PRIVATE-ENDPOINT/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_ENDPOINT_ACCESS_TOKEN" \
  -d '{
    "model": "YOUR_MODEL_NAME",
    "messages": [
      {"role": "user", "content": "What is the capital of Uttarakhand?"}
    ],
    "max_tokens": 512
  }' | jq .
json 复制代码
{
  "id": "chatcmpl-96e1bc75-1c4d-463a-9dd4-b9f17565f373",
  "object": "chat.completion",
  "created": 1779881516,
  "model": "anish-byom-qwen3-4b-tutorial",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "The capital of Uttarakhand is **Dehradun**.",
        "refusal": null,
        "annotations": null,
        "audio": null,
        "function_call": null,
        "tool_calls": [],
        "reasoning": null
      },
      "logprobs": null,
      "finish_reason": "stop",
      "stop_reason": null,
      "token_ids": null
    }
  ],
  "service_tier": null,
  "system_fingerprint": null,
  "usage": {
    "prompt_tokens": 17,
    "total_tokens": 32,
    "completion_tokens": 15,
    "prompt_tokens_details": null
  },
  "prompt_logprobs": null,
  "prompt_token_ids": null,
  "kv_transfer_params": null
}

正常的响应应当具备什么特征

一个健康的接口会返回包含 choices 数组的 JSON 报文。数组内部嵌套了 message.content 字段,里面即为模型生成的文本。如果系统抛出 401 错误,说明您的访问令牌有误或已过期;如果 TLS 报错,多半是因为 CA 证书路径有误,或者您当前的测试机并未接入该私有 VPC 网络。

公共端点(当您手动激活它时)

部分技术团队为了方便集成测试或预发(Staging)环境联调,会主动开启公共端点。两者的 JSON 报文结构完全相同。不同之处在于,由于公共端点使用的是标准权威证书链授信,您在调用时可以完全省去 --cacert 参数。不过在正式生产环境中,受到严苛法规定制的技术栈通常仍会强制保持在"纯私有内网"模式。

公共端点调用示例如下:

css 复制代码
curl --location 'https://YOUR-PUBLIC-ENDPOINT/v1/chat/completions' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_ENDPOINT_ACCESS_TOKEN' \
-d '{
  "model": "anish-byom-qwen3-4b-tutorial",
  "messages": [
    {
      "role": "user",
      "content": "What is the capital of Uttarakhand State in India?"
    }
  ],
  "max_tokens": 150
}' | jq
json 复制代码
{
  "id": "chatcmpl-96e1bc75-1c4d-463a-9dd4-b9f17565f373",
  "object": "chat.completion",
  "created": 1779881516,
  "model": "anish-byom-qwen3-4b-tutorial",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "The capital of Uttarakhand is **Dehradun**.",
        "refusal": null,
        "annotations": null,
        "audio": null,
        "function_call": null,
        "tool_calls": [],
        "reasoning": null
      },
      "logprobs": null,
      "finish_reason": "stop",
      "stop_reason": null,
      "token_ids": null
    }
  ],
  "service_tier": null,
  "system_fingerprint": null,
  "usage": {
    "prompt_tokens": 17,
    "total_tokens": 32,
    "completion_tokens": 15,
    "prompt_tokens_details": null
  },
  "prompt_logprobs": null,
  "prompt_token_ids": null,
  "kv_transfer_params": null
}

步骤 5:合规性、质量审查与全面监控

将微调大模型成功跑通一次简单的 curl 只是走向生产环境的第一步。在正式向最终用户开放之前,您需要坚实的技术证据来证明:模型的专业回答依然如预期般纯正、数据流转完全切合企业的信息合规红线,且周一早高峰的流量并不会冲垮端点的延迟底线。

VPC 与零数据留存(Zero Data Retention)

  • 当业务场景需要绝对的隔离性时,请将生产环境的应用流量全部发送到私有内网 URL(Private URL)。
  • 配置云防火墙(Cloud Firewalls),确保只有您的负载均衡器或应用层(App Tier)能够触达推理客户端的主机。
  • 如果您的合规协议规定:所有 Prompt(提示词)和 Completion(模型生成内容)绝对不能被存储用于滥用审查或质量抽样,请在推理工作区设置(Inference Workspace Settings)中开启零数据留存(Zero Data Retention)
  • 将这些安全控制项映射到您公司所采用的合规框架中。例如,医疗健康团队通常会参考 NIST RMF(风险管理框架)中的访问控制、审计以及传输保护系列规范。您的安全合作伙伴可以将这些平台产品设置转化为标准的合规控制语言。

模型评估(Model Evaluations)

若要在上线前开展大规模、结构化的质量测试,可以使用平台提供的"模型评估"功能。

  • 操作路径INFERENCE(推理) → Model Evaluations(模型评估) → New Evaluation(新建评估)
  • 与普通的 Playground 网页对话框不同,在评估流程中,您需要上传一个完整的数据集(支持 CSV 或 JSONL 格式,最大支持 1000 行且文件大小不超过 1 GB),将您的 BYOM 专用推理部署选为"候选模型(Candidate Model)",再选择一个大模型作为"裁判模型(Judge Model)"(例如 GPT-4o 或 Claude Sonnet),随后运行正确性(Correctness)、完整性(Completeness)或毒性(Toxicity)等指标的量化测试。平台将通过 LLM-as-a-judge(大模型作为裁判) 的工作流为每一行测试数据自动打分。

本教程配套的评估数据集示例

请上传名为 medical-eval-tutorial.csv 的文件(以下包含 15 行专为本教程定制的医疗问答提示词)。您可直接复制下方的数据内容,并将其粘贴到数据集上传文本框中。

lua 复制代码
input,expected_response
"{""messages"": [{""role"": ""user"", ""content"": ""What is the capital of Uttarakhand, India?""}]}","Dehradun is the capital of Uttarakhand."
"{""messages"": [{""role"": ""user"", ""content"": ""What are common symptoms of seasonal influenza?""}]}","Common symptoms include fever, cough, sore throat, body aches, and fatigue."
"{""messages"": [{""role"": ""user"", ""content"": ""What is hypertension?""}]}","Hypertension is persistently elevated blood pressure in the arteries."
"{""messages"": [{""role"": ""user"", ""content"": ""How does hand washing help prevent infection?""}]}","Hand washing removes germs from hands and reduces spread to the mouth, nose, and surfaces."
"{""messages"": [{""role"": ""user"", ""content"": ""What is type 2 diabetes?""}]}","Type 2 diabetes is a condition where the body does not use insulin effectively and blood sugar rises over time."
"{""messages"": [{""role"": ""user"", ""content"": ""When should someone call emergency services for chest pain?""}]}","Call emergency services for sudden severe chest pain, pain with shortness of breath, or pain spreading to the arm, jaw, or back."
"{""messages"": [{""role"": ""user"", ""content"": ""What is a normal resting heart rate for adults?""}]}","A normal resting heart rate for most adults is about 60 to 100 beats per minute."
"{""messages"": [{""role"": ""user"", ""content"": ""What are signs of dehydration?""}]}","Signs include thirst, dry mouth, dark urine, dizziness, and reduced urination."
"{""messages"": [{""role"": ""user"", ""content"": ""What is asthma?""}]}","Asthma is a chronic condition where airways narrow and swell, causing wheezing and shortness of breath."
"{""messages"": [{""role"": ""user"", ""content"": ""Why are vaccines important?""}]}","Vaccines train the immune system to recognize pathogens and reduce the risk of severe illness."
"{""messages"": [{""role"": ""user"", ""content"": ""What is anemia?""}]}","Anemia is a condition with lower than normal red blood cells or hemoglobin, often causing fatigue."
"{""messages"": [{""role"": ""user"", ""content"": ""How much sleep do adults typically need?""}]}","Most adults need about 7 to 9 hours of sleep per night for good health."
"{""messages"": [{""role"": ""user"", ""content"": ""What is food poisoning?""}]}","Food poisoning is illness from eating contaminated food, often causing nausea, vomiting, and diarrhea."
"{""messages"": [{""role"": ""user"", ""content"": ""What is a migraine?""}]}","A migraine is a neurological headache episode that may include throbbing pain, nausea, and sensitivity to light."
"{""messages"": [{""role"": ""user"", ""content"": ""What does BMI measure?""}]}","BMI estimates body fat based on height and weight, used as a general screening tool."
  • 列名解析input 列为聊天补全(Chat Completions)的标准 JSON 结构消息(注意:并非纯文本 Query),expected_response 列为供裁判模型比对的参考标准答案。本数据集仅供实验室测试使用,并非真实临床患者数据。

在控制面板中的操作步骤:

进入 Model EvaluationsNew EvaluationAdd datasetUpload → 选择该 CSV 文件。

标准的评估配置流:

选择数据集 ------ 上传 medical-eval-tutorial.csv

选择候选模型 ------ 勾选您刚刚部署好的 BYOM 专用推理端点。

系统提示词(System Prompt) ------ 粘贴您计划在生产环境中使用的标准系统提示词,以确保评估得分能客观反映真实业务表现。例如:

markdown 复制代码
> _"您负责协助临床医生。您不提供直接诊断。请务必提醒用户与医疗专业人员进行确认。"_

选择裁判模型 ------ 从独立的模型目录中选择一个大模型来为您的候选模型输出打分(此操作会消耗裁判模型的 Token 费用)。

设定评测指标 与星级通过门槛,随后点击 Run(运行)。

当运行结束时,审查每一行的具体得分,并将结果一键 Download(下载)为 JSON 报告。

当您在产品正式发布前,需要具备可复现的、基于标准数据集的硬性质量证明 时,请使用模型评估(Model Evaluations)功能;而当您只需要快速验证端点是否能正常开口说话时,使用 curl 跑一个简易的冒烟测试即可。

下图是一个输出的示例

故障排查(当出现问题时)

异常现象 (Symptom) 可能原因 (Likely cause) 应对措施 (What to try)
BYOM 导入失败 (Import Failed) 缺少 Tokenizer 相关配置文件,或模型文件格式不对。 将您的本地文件夹布局与官方的导入规范文档进行细致比对。
无效的模型提供商 (invalid model provider) 在通过 API 调用 BYOM 模型时,错误地指定了 hugging_face 作为 provider。 在 API 请求中,将提供商变更为 model_catalog,并正确传入您的 provider_model_id
状态卡在部署中 (Stuck on Provisioning) 该可用区(Region)当前的 GPU 物理算力库存全满。 耐心等待片刻,或者尝试切换到其他可用区或不同的 GPU 规格重新部署。
401 未授权 (401 Unauthorized) 访问令牌(Token)存在拼写错误,或者该密钥已过期。 重新生成一个干净、合法的端点访问密钥(Endpoint Access Key)。
TLS / 证书错误 (TLS / certificate error) 引用了错误的 CA 证书路径,或者您正在 VPC 外部的网络环境发起请求。 确保测试机处于同一私有 VPC 内,并配合下载好的 CA 证书文件执行命令。
模型的回答质量很不正常 微调训练过程出了偏差,或系统提示词不匹配。 使用 curl 或模型评估重新测试;针对性调整系统提示词或清洗、优化微调训练集。
GPU Droplet 提示 bf16/gpu 或 CUDA 驱动过旧 PyTorch 安装包的版本(Wheel)与 Droplet 物理机的底层驱动版本不匹配。 参考步骤 1 ,检查 train_model.py 是否在 bf16 或 CUDA 检测阶段就发生崩溃。
训练时提示仓库受限 / 请登录 (Please log in) 使用了 Hugging Face 上需要审核受限(Gated)的基础模型。 参考步骤 1,先在机器上执行 Hugging Face 登录鉴权。
训练数据集分词时提示需要 jinja2>=3.1.0 Droplet 机器上默认预装的 Jinja2 版本过低。 优先执行 pip install --upgrade "jinja2>=3.1.0" 升级依赖。

资源销毁与清理(及时停止计费)

为了避免实验室环境产生不必要的持续开销,实验结束后请务必清理以下资产:

  1. 销毁专用推理部署 :进入 INFERENCEDedicated Inference → 点击省略号 ... → 选择 Destroy
  2. 删除自定义模型必须在专用推理端点完全销毁后 ,才能移除模型目录中的资产。路径:INFERENCEModel CatalogMy Models → 点击省略号 ... → 选择 Delete
  3. 释放 GPU Droplet:如果您为了本次微调训练专门创建了 GPU 云服务器,请记得将其关机并彻底释放(Delete)。

注意:只要上述物理资源与 BYOM 存储空间依然存在在您的账户中,平台就会持续计费(按 GPU 运行小时数及存储容量累计)。

行业前沿焦点问答(FAQs)

1. 到底什么是 Serverless(无服务器)推理?

Serverless 推理是一种完全免去了开发者自行租赁、运维底层物理 GPU 复杂度的先进全托管 AI 调度范式。您只需将写好的业务请求直接投递给云平台已经为您架设好的共享基础底座大模型端点,整个计费模型完全跟您的最终业务表现挂钩(在 DigitalOcean 平台上通常精准细化到按您每次调用产生的 Token 数量进行计量),您不需要为任何闲置的纯硬件时间多掏一分钱冤枉钱。它最完美的舞台是:产品前期的快速原型验证、业务流量带有极大断崖式突发特征的互联网应用、以及直接使用标准的行业开源大模型底座的通用场景。它的局限性在于:您无法通过这种模式去上传和托管团队私有的、精细化微调后的专属大模型权重文件。

2. 什么是专用推理(Dedicated Inference)?

专用推理是 DigitalOcean 平台上的一项全托管服务,它会为您在私有网络(VPC)内部独立分配一块或多块专属的预留 GPU。与共享算力的无服务器推理不同,专用推理可确保您的自定义模型(包括通过 BYOM 导入的模型)拥有始终如一的常驻算力、极度稳定的超低延迟以及完全隔离的安全隐私边界。这种模式不再按 Token 计费,而是纯粹根据您租用的 GPU 运行小时数进行固定结算,非常适合生产环境中有持续、稳定流量交付的业务场景。

3. 什么是 BYOM(自带模型)?

BYOM(Bring Your Own Model)是 DigitalOcean 平台提供的一项核心桥梁功能,允许开发者将自己在外部(如本地、第三方 GPU 集群)微调训练好的专属大模型权重,无缝导入并注册到 DigitalOcean 的私有模型目录(My Models)中。通过 BYOM 注册后,平台便能完美识别、加载并在专用推理集群的物理 GPU 上平稳运行该模型,使您既能享受开源或自定义算法的灵活性,又能免去繁重的底层基础设施运维负担。

4. 专用推理(Dedicated Inference)支持哪些模型架构?

Dedicated Inference 的 BYOM 导入功能深度支持业界绝大多数主流的开源大模型架构,包括但不限于 Llama (Meta)、Qwen (阿里云通义千问)、Mistral/Mixtral、Gemma (Google) 以及 Phi (微软) 等系列。只要您的模型文件符合 Hugging Face 标准的 Safetensors 格式规范,且底层算子在支持的架构列表中,即可顺畅完成导入与拉起。有关具体支持的模型版本细则与显存配额要求,可随时查阅官方的 BYOM 架构兼容性文档

5. 如果我的请求流量带有巨大的突发性,该如何选择?

如果您的 AI 应用流量呈现出极其剧烈的断崖式波动------例如白天请求量飙升,而深夜几乎处于完全闲置状态------且您使用的是业界标准的标准模型,那么首选推荐是 Serverless(无服务器)推理。在 Serverless 模式下,您无需承担任何硬件闲置带来的经济成本,完全按实际消耗的 Token 数量用多少付多少。但如果您由于业务合规、极度隐私或特定的业务深度定制,必须运行自己微调的私有模型,则建议采用专用推理,并通过编写脚本或配置平台策略,在业务完全空闲的特定周期内手动销毁部署,以达成成本与性能的平衡。

6. 如何利用 DigitalOcean 的 API 自动管理 BYOM 专用推理集群?

在实际的生产流水线中,通过控制面板进行手动点击往往无法满足 CI/CD(持续集成与持续部署)的自动化要求。DigitalOcean 为专用推理和 BYOM 提供了完整的 REST API 支持,使您能够将模型的导入与部署完全融入到自动化的工程脚本中。

步骤 A:通过 API 发起 BYOM 模型导入

您可以通过向模型目录端点发送一个 POST 请求,将 Hugging Face 上的私有权重拉取到您的 DigitalOcean 账户中:

vbnet 复制代码
curl -X POST "https://api.digitalocean.com/v2/inference/models" \
  -H "Authorization: Bearer YOUR_DIGITALOCEAN_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "clinical-notes-qwen-1.5b",
    "provider": "hugging_face",
    "provider_model_id": "your-org/your-model-name",
    "categories": ["custom"],
    "region": "nyc2"
  }'

步骤 B:通过 API 一键拉起专用推理端点

当模型导入完成且状态变为 Ready 后,您可以直接通过 API 申请专属的 GPU 硬件资源并创建私有端点:

vbnet 复制代码
curl -X POST "https://api.digitalocean.com/v2/inference/dedicated-deployments" \
  -H "Authorization: Bearer YOUR_DIGITALOCEAN_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "clinical-notes-prod-v1",
    "model_id": "刚刚导入成功的_MODEL_ID",
    "region": "nyc2",
    "gpu_configuration": {
      "type": "NVIDIA-H100",
      "count": 1
    },
    "vpc_uuid": "您的VPC_UUID_以确保网络内网隔离",
    "public_endpoint_enabled": false
  }'

总结

将微调后的自定义大语言模型从小规模的实验室原型,成功推向具备高隐私合规性的生产级应用,不仅需要对算法权重进行精细调整,更需要一套稳固、安全且可预测的云端 AI 基础设施。

通过使用 DigitalOcean 的 BYOM(自带模型)专用推理(Dedicated Inference) 架构,技术团队既能保持对专属微调权重的绝对控制,又能将所有推理流量严格锁定在私有网络(VPC)边界内部,完美断绝了通过共享公共 API 传输敏感数据(如患者 PHI、企业机密代码等)的安全隐患。

随着 AI 技术的演进,生产环境的竞争焦点已逐步从"一次性的模型训练成本"转化为"长期的、高并发的每日推理运营支出"。构建一套推理优先(Inference-first)、低延迟且高度可观测的自动化架构,将是您的 AI 核心产品在市场中实现规模化良性增长的坚实技术基石。

相关推荐
叫我少年14 小时前
DeepSeek V4 Pro + Flash 分工编程:成本骤降 60%+ 的混合模型工作流
llm
OpenBayes贝式计算14 小时前
LongCat-Video-Avatar 1.5开源,具备全领域泛化能力的音频驱动视频生成模型;AI Student Impact Dataset 5 万量级多
google·llm·agent
质造者15 小时前
Prompt工程从入门到进阶!基于通义千问实战零样本/少样本/CoT/攻防防范(附完整代码)
大模型·llm·prompt·测试提升
星浩AI17 小时前
(七)GPT2中文生成模型定制化微调训练[附源码]
pytorch·深度学习·llm
慢慢向上的蜗牛21 小时前
Qwen3-0.6B ONNX(KV-Cache)模型部署
llm·onnx·文本生成·自回归·kv-cache
Java陈序员1 天前
一键测算!一款筛选本机可流畅运行的大模型终端工具!
rust·llm
Together_CZ1 天前
OpenCV 5.0 重磅发布:全面技术深度解析
图像处理·人工智能·opencv·计算机视觉·llm·dnn·推理
呆呆敲代码的小Y1 天前
CodeGraph 使用教程:专为代码库打造的知识图谱
人工智能·ai·llm·知识图谱·代码库·codegraph·代码知识库