开源大模型的这一年

大模型领域的开源运动,过去一年最重要的变化不是某个榜单成绩,而是“可用性”的量变:从只能演示的小模型,到能在单机、单卡甚至消费级显卡上跑出可接受效果的中等规模模型;从只放出权重,到配套放出推理框架、量化版本、微调脚本与部署工具。

开源在这个领域的价值,从来不是替代最强的闭源模型,而是让“够用的能力”变成一项可以自行部署、自行审计、自行改造的基础设施。

这条路径上有三个标志性节点值得关注:一是模型权重的开放让本地部署成为现实;二是量化与推理优化技术把硬件门槛降到了消费级;三是以开放权重为核心的生态开始出现衍生模型、工具链与社区微调版本。三者叠加,才有了今天中小企业可以在内网里跑起一套自有模型的条件。

本文所述动向来自公开渠道的整理,具体模型能力、许可条款与版本状态请以各项目官方仓库与许可证原文为准。

开放权重不等于开源

这是讨论中最容易被混淆的概念,却直接影响合规风险。严格意义上的开源软件,要求使用者能够自由运行、研究、修改和分发,并且许可证需符合开源定义。而不少大模型发布的只是“开放权重”:权重可下载、可用于推理,但训练数据、训练代码未必公开,许可证还可能包含使用范围、月活规模、商业用途等附加限制。

使用前必须确认的几件事
  • 是否可商用部分许可仅限研究与个人使用,商业场景需要单独授权,这一点必须在立项前确认。
  • 规模门槛个别许可会设置月活跃用户或其他量级门槛,超过后需另行申请,成长中的产品尤其容易踩到。
  • 衍生与再分发是否允许微调后分发、是否需要保留原始声明与命名要求,各许可差异很大。
  • 输出内容的责任许可通常不承担生成内容的合规责任,这部分由使用者自行承担。

实践中的建议是:把许可证核对作为选型的第一步而不是最后一步。一份几页的许可文本,花半小时读完,可以避免上线之后才发现需要更换模型的返工。

模型谱系与能力分层

把当前的开源与开放权重模型按规模分层看,会更容易做出选择。不同量级的模型适用的场景差异非常明显,简单地“选最大的”往往既浪费成本又得不到更好的结果。

  • 小规模模型(数亿到十余亿参数):适合文本分类、结构化抽取、意图识别、简单改写这类边界清晰的任务。可以跑在普通显卡甚至 CPU 上,延迟低、成本可控,是本地化落地的常见起点。
  • 中等规模模型(数十亿到百亿级参数):具备一定的推理与对话能力,适合构建知识问答、代码辅助、内容生成类应用,经量化后可在单卡或双卡环境运行。
  • 大规模模型(百亿以上):需要多卡或集群资源,通常以服务化方式部署。对多数团队而言,自建这类规模的模型在经济上并不划算。
  • 专用小模型:针对代码、数学、多语言等方向单独训练的版本,在特定任务上能以更小的规模取得接近通用的效果,是降本的有效路径。

谱系上,海外的 Llama 系列长期是最重要的开放权重来源;国内多个团队也持续放出高质量的开源模型,中文能力与本地部署工具链是其显著优势。这些模型的能力差距在缩小,同一量级里往往只有细微差别,真正的差异更多地体现在工具生态、许可宽松度与社区活跃度上。

本地部署的硬件账

自建推理服务的第一道门槛是显存。除了模型权重本身,还要为推理过程中的中间激活与上下文缓存留出空间。下面这段估算脚本可以快速算出不同精度下的大致需求,用于判断能不能塞进现有的机器。

# 估算本地部署大模型所需的显存(单位:GB)
def vram_gb(params_b, bytes_per_param=2, kv_cache_gb=0.5, overhead=1.15):
    """params_b: 参数量(十亿)
       bytes_per_param: 2=FP16, 1=INT8, 0.5=INT4
       kv_cache_gb: 上下文缓存占用;overhead: 框架与碎片预留系数"""
    weights = params_b * bytes_per_param
    return (weights + kv_cache_gb) * overhead

print(f"{'规模':<14}{'FP16':>10}{'INT8':>10}{'INT4':>10}")
for name, params in [("小模型 1.5B", 1.5),
                     ("中等模型 7B", 7),
                     ("较大模型 32B", 32)]:
    row = (f"{name:<14}"
           f"{vram_gb(params, 2):>9.1f}G"
           f"{vram_gb(params, 1):>9.1f}G"
           f"{vram_gb(params, 0.5):>9.1f}G")
    print(row)

按这个模型估算,7B 量级在 INT4 量化后大致需要 4G 出头的显存,这正是消费级显卡能够承载的范围;而 32B 即使在 INT4 下也需要十几 GB,单卡勉强可行但余量很小。需要强调的是,这是粗略估算而非精确值,实际占用会随上下文长度、并发量与推理框架的实现方式变化,尤其长上下文带来的缓存开销往往被低估。

加载与推理的最小示例

确认硬件够用之后,下一步是把模型跑起来。下面这段代码使用常见的高层接口加载模型并完成一次推理,只需要替换成自己选用的开源模型仓库地址即可运行。

# 最小推理示例:需要 pip install transformers torch
from transformers import AutoTokenizer, AutoModelForCausalLM

# 替换为你选用的开源模型仓库地址(首次运行会自动下载权重)
MODEL_ID = "your-org/your-model"

tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForCausalLM.from_pretrained(
    MODEL_ID,
    device_map="auto",          # 自动分配到可用显卡
    load_in_4bit=True,          # 需要 bitsandbytes,4bit 量化显著降低显存
)

prompt = "用三句话解释什么是消息队列。"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

outputs = model.generate(
    **inputs,
    max_new_tokens=256,
    temperature=0.7,            # 越高越随机,事实类任务建议调低
    do_sample=True,
)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

几个参数值得留意:max_new_tokens 决定输出长度上限,设置过大既慢又容易跑题;temperature 影响随机性,抽取类任务应调低甚至使用贪心解码;量化开关会明显影响显存占用,但也会带来一定的效果损失,需要在自己的实际任务上验证,而不是只看通用评测分数。

开放圆环与模型网络节点连线结合的开源意象插画
开放权重把模型从“只能调用的接口”变成“可以用起来的资产”,这也是本地化部署与自主可控的基础。