AI模型是软件吗?——低层技术视角
Source: Dev.to
请提供您希望翻译的完整文本(除代码块和 URL 之外),我将把它翻译成简体中文并保持原有的 Markdown 格式。谢谢!
背景
我最近在 dev.to 上发布了一篇文章,记录了我测试小型和大型语言模型的经历。我是一名工程技术员,而不是软件工程师、开发者、程序员或编码人员。由于 dev.to 是面向软件领域人士的平台,这让我思考 AI 是否真的算作软件,以及我是否应该在这里发布我的 AI 文章。
如今 AI 与软件紧密交织,这个问题听起来似乎有点奇怪。日常交流时,我们的答案通常是“是”:大语言模型(LLM)和小语言模型(SLM)由工程师构建,通过软件流水线交付,并由程序运行。然而,从系统程序员、编译器编写者或硬件设计师的角度来看,这个问题并不简单。到底什么是 AI 模型,它包含了什么,它是否符合软件的技术定义?
什么是软件?
在硬件和系统设计的语境中,软件是 可执行逻辑——一系列指令(机器码、字节码或解释型源代码),处理器可以执行它们。它体现了控制流:
- 分支
- 循环
- 调用与返回
任何能够解析为 CPU 或加速器可以运行的指令流的东西都算作软件。相反,仅仅存储数据的文件,即使它随应用程序一起打包,也不真正符合此定义。
什么是 AI 模型?
在最纯粹的意义上,经过训练的小型或大型语言模型通常以 .safetensors、.gguf 或 .pth 等扩展名的文件形式分发。文件内部是大型多维数组——在训练过程中学习得到的权重和偏置。这些数字 参数化了一个固定的数学函数:它们告诉神经元对另一个神经元的影响力度、如何对特征加权,以及信号在层之间如何传播。
关键特性
- 模型文件 不包含控制流——没有条件语句、循环或类似 “如果 X 则 Y” 的指令。
- 它不是算法;它是对存在于其他位置的算法的参数化。
- 像 safetensors 这样的格式刻意设计为仅存储原始数据和元数据,明确禁止嵌入可执行代码,以防止远程代码执行攻击。这一设计选择强调模型应被视为惰性数据,而非可执行的工件。
执行与运行时
CPU 无法直接解释 .gguf 文件;GPU 在没有驱动的情况下也无法运行它;你不能把文件设为可执行(chmod +x)后直接启动。要产生输出,必须将模型加载到 推理引擎 中——这是一段用 C++、Python、Rust 等语言编写的软件,了解模型的结构,执行张量运算,调度工作,并管理内存。
所有矩阵乘法、激活函数以及缓存管理的逻辑都位于这个运行时中,而不是模型本身。相同的模型文件在不同情况下的表现可能截然不同,取决于:
- 运行时的实现
- 硬件(CPU、GPU、加速器)
- 精度或量化方案
这种依赖性在 数据(模型) 与 运行该模型的软件(推理引擎) 之间划出了一条清晰的界限。
神经网络模糊了传统数据与代码之间的界限。在常规程序中,行为是通过条件语句和循环显式编码的。而在神经网络中,行为是隐式编码在数值权重中的:微调数以百万计的数字可以像重写数千行代码一样改变系统的输出。
然而,权重描述的是 使用什么值,而不是 如何计算这些值。算法——即“如何”——是固定且外部的;权重只是该算法内部的系数。这就是为什么两个不同的运行时可以加载同一个模型并产生相同结果,即使它们采用完全不同的执行策略。软件决定执行方式,模型提供参数。
含义
这些模型被视为软件的关联很大程度上来源于它们最常见的应用之一——作为开发者助理工具,如 Claude Opus、Qwen 或 Copilot。但生成源代码只是通用统计模型的一种应用。模型是编写 Python、进行语言翻译、预测蛋白质结构还是对图像进行分类,都不会改变其内部结构。输出代码的模型并不比包含代码片段的 CSV 文件更“软件”。
考虑一个模型文件并计算其校验和——保持每个字节不变。现在仅更改其周围的运行环境:
- 将 PyTorch 替换为
llama.cpp - 从 CUDA 切换到 CPU
- 将量化从 fp32 改为 int4
- 将指令集从 AVX2 切换到 AVX‑512
模型本身保持不变,但延迟、内存使用量,甚至数值结果都可能相差数个数量级。唯一改变的是可执行逻辑,这证明模型本身 不是软件。
在实际操作中,模型会像其他软件组件一样进行版本管理、分发、缓存、部署和回滚。它们存放在代码仓库中,存在兼容性约束,并会被监控以防回归。但它们并不是软件。
结论
一个 AI 模型,单独来看,是数据——一个经过训练的数值制品,编码了数学函数的参数。它不包含可执行的逻辑、控制流或指令。只有当推理引擎(软件)解释这些数字时,模型才会成为软件系统的一部分。
这种区分对于正确性、安全性、审计以及形式化推理都很重要。它提醒我们,现代 AI 并没有用魔法取代算法;它用学习得到的参数取代手写规则,而这些参数仍然由传统代码进行求值。
因此,基于我自己提出的问题,我的结论是:不,SLM 或 LLM 不是软件;它们是一组经过训练的数字,只有在被可执行代码解释时才成为软件系统的一部分。