8步实现AI原生应用的模型量化部署:从大模型到端侧“小钢炮”的蜕变之路

关键词

模型量化、AI原生应用、INT8推理、部署优化、TensorRT、ONNX、Post-Training Quantization (PTQ)、Quantization-Aware Training (QAT)

摘要

你是否遇到过这样的困境?训练好的AI模型在服务器上跑得飞快,放到手机/边缘设备上却像“蜗牛爬”——要么延迟高得离谱,要么直接因内存不足崩溃。这不是你的模型不够好,而是模型太大、计算量太高,不适合端侧环境。

模型量化部署是解决这个问题的“终极武器”:它能将32位浮点数(FP32)模型压缩到8位整数(INT8)甚至更低,同时保持95%以上的精度,让模型在手机、摄像头、智能手表等端侧设备上“轻装上阵”。

本文将用8个可落地的步骤,从原理到实战,教你把大模型变成端侧能跑的“小钢炮”。无论是图像分类、目标检测还是大语言模型(LLM),你都能通过这套流程实现高效部署。

一、背景介绍:为什么需要模型量化部署?

1.1 AI原生应用的“端侧刚需”

随着AI从“云端”走向“边缘”,AI原生应用(如实时翻译、智能监控、手机拍照增强)对模型的要求越来越高:

  • 低延迟:比如手机上的实时目标检测,需要在100ms内返回结果;
  • 低功耗:智能手表的电池容量小,不能让模型“吃电如喝水”;
  • 隐私保护:用户的照片、语音数据不想传到云端,端侧处理更安全。

但问题是,现代AI模型(比如ResNet-50、BERT、YOLOv8)的大小往往在几十MB到几GB之间,计算量高达几十G FLOPs(每秒浮点运算次数),根本无法在端侧设备上高效运行。

1.2 模型量化:用“压缩”换“性能”

模型量化的核心思想是用更低精度的数值(如INT8)代替高精度的FP32,从而减少模型大小和计算量:

  • 模型大小:INT8比FP32小4倍(1字节 vs 4字节),比如ResNet-50的FP32模型约100MB,INT8模型仅25MB;
  • 计算速度:INT8计算的硬件利用率更高(比如NVIDIA GPU的INT8吞吐量是FP32的4倍以上);
  • 内存占用:减少内存读取次数,降低端侧设备的内存压力。

1.3 目标读者与核心挑战

目标读者:算法工程师、AI应用开发者(想把模型放到端侧的人)。
核心挑战

  • 如何在压缩模型的同时,保持足够的精度?
  • 如何选择合适的量化方法(PTQ vs QAT)?
  • 如何将量化后的模型部署到不同的端侧设备(Android/iOS/边缘芯片)?

二、核心概念解析:用“装水”比喻理解量化

在开始实战前,我们需要先搞懂几个核心概念。用一个生活化的比喻:模型的权重就像“装满水的杯子”,FP32是大杯子(能装更多水,但占空间),INT8是小杯子(占空间小,但要防止水洒出来)。

2.1 量化的本质:“缩放”与“ rounding”

量化的过程可以拆解为两步:

  1. 计算缩放因子(Scale):把FP32的数值范围映射到INT8的范围([-128, 127])。比如,假设某个权重的取值范围是[-2.0, 1.5],那么缩放因子s=max⁡(∣−2.0∣,∣1.5∣)/127=2.0/127≈0.0157s = \max(|-2.0|, |1.5|) / 127 = 2.0 / 127 ≈ 0.0157s=max(2.0∣,∣1.5∣)/127=2.0/1270.0157
  2. ** rounding**:把FP32数值除以缩放因子,取整得到INT8数值。比如,权重值1.2对应的INT8数值是round(1.2/0.0157)≈76\text{round}(1.2 / 0.0157) ≈ 76round(1.2/0.0157)76

反量化则是把INT8数值乘回缩放因子,恢复成近似的FP32数值:1.2≈76×0.0157≈1.1931.2 ≈ 76 × 0.0157 ≈ 1.1931.276×0.01571.193

公式总结(对称量化,最常用的量化方式):
wint8=round(wfp32/s)wfp32≈wint8×ss=max⁡(∣wfp32∣)127 \begin{align*} w_{\text{int8}} &= \text{round}(w_{\text{fp32}} / s) \\ w_{\text{fp32}} &≈ w_{\text{int8}} × s \\ s &= \frac{\max(|w_{\text{fp32}}|)}{127} \end{align*} wint8wfp32s=round(wfp32/s)wint8×s=127max(wfp32)

2.2 PTQ vs QAT:“事后压缩”与“提前规划”

量化方法主要分为两类:

  • Post-Training Quantization(PTQ):训练完模型后再做量化,相当于“把照片转成JPG”。优点是不需要重新训练,流程简单;缺点是精度损失可能较大(尤其是对于小模型)。
  • Quantization-Aware Training(QAT):训练时就加入量化误差的模拟,相当于“用相机拍的时候就调小分辨率,但更清晰”。优点是精度损失小(通常下降≤1%);缺点是需要重新训练,流程复杂。

选择建议

  • 如果模型较大(如ResNet-50、BERT),且有足够的校准数据,选PTQ;
  • 如果模型较小(如MobileNet-v2),或对精度要求极高(如医疗影像),选QAT。

2.3 量化部署的“工具链”

量化后的模型需要通过部署框架运行在端侧设备上。常见的工具链如下:

模型格式 量化工具 部署框架 支持设备
PyTorch PyTorch Quantization API TensorRT、ONNX Runtime NVIDIA GPU、CPU
TensorFlow TFLite Converter TFLite Android、iOS、边缘芯片
ONNX ONNX Runtime Quantizer ONNX Runtime、TensorRT 跨平台

关键结论:ONNX是“中间格式桥梁”,几乎所有框架都支持将模型转成ONNX,再量化部署到不同设备。

三、8步实现模型量化部署:从原理到实战

接下来,我们以ResNet-50图像分类模型为例,一步步实现从FP32到INT8的量化部署,目标设备是Android手机(搭载Snapdragon 8 Gen 2芯片)

步骤1:模型选择与准备

目标:选择适合量化的模型,并转成ONNX格式。
为什么选ResNet-50? 它是经典的图像分类模型,大小适中(FP32约100MB),量化后性能提升明显。

1.1 加载预训练模型

用PyTorch加载预训练的ResNet-50模型:

import torch
from torchvision.models import resnet50, ResNet50_Weights

# 加载预训练权重(使用最新的权重版本)
weights = ResNet50_Weights.IMAGENET1K_V2
model = resnet50(weights=weights)
model.eval()  # 切换到评估模式
1.2 转成ONNX格式

ONNX是跨框架的中间格式,方便后续量化和部署。用PyTorch的torch.onnx.export函数转换:

# 示例输入( batch size=1,3通道,224x224分辨率)
example_input = torch.randn(1, 3, 224, 224)

# 导出ONNX模型
torch.onnx.export(
    model,                  # 模型
    example_input,          # 示例输入
    "resnet50_fp32.onnx",   # 输出路径
    input_names=["input"],  # 输入节点名称
    output_names=["output"],# 输出节点名称
    opset_version=13        # ONNX版本(建议用11以上)
)

检查ONNX模型:用onnxruntime加载模型,验证输出是否正确:

import onnxruntime as ort

session = ort.InferenceSession("resnet50_fp32.onnx")
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name

# 运行推理
output = session.run([output_name], {input_name: example_input.numpy()})
print(output[0].shape)  # 应输出(1, 1000),对应ImageNet的1000类

步骤2:选择量化方法(PTQ vs QAT)

目标:根据模型大小和精度要求,选择合适的量化方法。
我们以PTQ为例(流程更简单,适合初学者),如果需要更高精度,可以换成QAT(步骤类似,但需要重新训练)。

2.1 PTQ的核心步骤

PTQ需要校准数据(Calibration Data)——用少量真实数据喂模型,计算权重和激活的数值范围,从而确定缩放因子。
校准数据的要求:

  • 数量:100-1000张(足够代表数据分布);
  • 质量:与测试集分布一致(比如用ImageNet的验证集)。
2.2 准备校准数据

用PyTorch的ImageFolder加载ImageNet验证集的子集:

from torchvision.datasets import ImageNet
from torchvision.transforms import Compose, Resize, CenterCrop, ToTensor, Normalize

# 数据预处理(与训练时一致)
transform = Compose([
    Resize(256),
    CenterCrop(224),
    ToTensor(),
    Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 加载校准数据(取前100张)
calibration_dataset = ImageNet(
    root="/path/to/imagenet",
    split="val",
    transform=transform
)
calibration_dataloader = torch.utils.data.DataLoader(
    calibration_dataset,
    batch_size=1,
    shuffle=False
)

步骤3:用ONNX Runtime进行PTQ量化

目标:将FP32的ONNX模型量化为INT8模型。
ONNX Runtime提供了Quantization Tool,支持PTQ量化,流程如下:

3.1 安装ONNX Runtime量化工具
pip install onnxruntime onnxruntime-tools
3.2 编写量化脚本

onnxruntime.quantization.quantize_static函数进行静态量化(需要校准数据):

from onnxruntime.quantization import quantize_static, CalibrationDataReader, QuantType

# 自定义校准数据读取器
class ImageNetCalibrationDataReader(CalibrationDataReader):
    def __init__(self, dataloader):
        self.dataloader = iter(dataloader)
        self.input_name = "input"  # 与ONNX模型的输入节点名称一致

    def get_next(self):
        try:
            data = next(self.dataloader)[0].numpy()  # 取图像数据(batch size=1)
            return {self.input_name: data}
        except StopIteration:
            return None

# 初始化校准数据读取器
calibration_reader = ImageNetCalibrationDataReader(calibration_dataloader)

# 量化配置
quantize_static(
    model_input="resnet50_fp32.onnx",          # 输入FP32模型
    model_output="resnet50_int8.onnx",         # 输出INT8模型
    calibration_data_reader=calibration_reader,# 校准数据读取器
    quant_format=QuantType.QInt8,              # 量化类型(INT8)
    per_channel=True,                          # 按通道量化(精度更高)
    reduce_range=False,                        # 是否缩小量化范围(建议False)
    op_types_to_quantize=["Conv", "MatMul"]    # 需要量化的算子(卷积、矩阵乘法)
)

关键参数说明

  • per_channel:按通道量化(每个卷积层的每个通道都有自己的缩放因子),比按张量量化(整个张量用一个缩放因子)精度更高;
  • op_types_to_quantize:指定需要量化的算子(卷积和矩阵乘法是计算量最大的算子,量化它们能显著提升性能)。
3.3 验证量化模型的精度

用测试集验证量化后的模型精度(比如Top-1准确率):

from torchmetrics import Accuracy

# 加载测试数据(ImageNet验证集)
test_dataset = ImageNet(
    root="/path/to/imagenet",
    split="val",
    transform=transform
)
test_dataloader = torch.utils.data.DataLoader(
    test_dataset,
    batch_size=32,
    shuffle=False
)

# 加载INT8模型
session_int8 = ort.InferenceSession("resnet50_int8.onnx")
input_name = session_int8.get_inputs()[0].name
output_name = session_int8.get_outputs()[0].name

# 计算Top-1准确率
accuracy = Accuracy(task="multiclass", num_classes=1000)

for images, labels in test_dataloader:
    # 转换为numpy数组(ONNX Runtime需要numpy输入)
    images_np = images.numpy()
    # 运行INT8推理
    outputs = session_int8.run([output_name], {input_name: images_np})[0]
    # 计算准确率
    accuracy.update(torch.tensor(outputs), labels)

# 打印结果
print(f"INT8模型Top-1准确率:{accuracy.compute().item():.4f}")

预期结果:ResNet-50的FP32模型Top-1准确率约78.8%,INT8模型约78.5%(下降≤0.3%),完全符合端侧应用的要求。

步骤4:将ONNX模型转成端侧部署格式

目标:将INT8的ONNX模型转成适合Android设备的格式(比如TensorRT Engine或TFLite)。
我们选择TensorRT(NVIDIA的推理框架,支持Snapdragon芯片的GPU加速)。

4.1 安装TensorRT

下载并安装适合你的系统的TensorRT(参考NVIDIA官方文档):

# 安装TensorRT Python包
pip install tensorrt
4.2 用trtexec工具转换模型

trtexec是TensorRT提供的命令行工具,用于将ONNX模型转成TensorRT Engine(.engine文件):

trtexec --onnx=resnet50_int8.onnx --saveEngine=resnet50_int8.engine --int8 --batch=1

参数说明

  • --onnx:输入的ONNX模型路径;
  • --saveEngine:输出的TensorRT Engine路径;
  • --int8:启用INT8推理;
  • --batch:设置 batch size(端侧应用通常用batch size=1)。
4.3 验证TensorRT Engine的性能

trtexec测试推理时间:

trtexec --loadEngine=resnet50_int8.engine --batch=1 --warmUp=100 --iterations=1000

预期结果:在Snapdragon 8 Gen 2芯片上,INT8模型的推理时间约为10ms(FP32模型约为40ms),性能提升4倍。

步骤5:搭建Android部署环境

目标:在Android Studio中搭建TensorRT部署环境。

5.1 下载TensorRT Android SDK

从NVIDIA官网下载TensorRT Android SDK(包含库文件和示例代码)。

5.2 配置Android Studio项目
  1. 将TensorRT的lib文件夹(包含libnvinfer.so等库文件)复制到项目的app/src/main/jniLibs/arm64-v8a目录下;
  2. build.gradle文件中添加依赖:
    android {
        defaultConfig {
            ndk {
                abiFilters "arm64-v8a"  // 支持64位ARM架构
            }
        }
    }
    
    dependencies {
        implementation files("libs/tensorrt-android-8.6.1.jar")  // TensorRT Java API
    }
    

步骤6:集成TensorRT推理引擎

目标:在Android应用中加载TensorRT Engine,实现图像分类功能。

6.1 编写Java代码加载模型
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.nvidia.developer.opengl.utils.NvAssetLoader;
import com.nvidia.developer.tools.nvtx.Nvtx;
import com.nvidia.developer.tools.nvtx.NvtxColor;
import com.nvidia.developer.tools.nvtx.NvtxRange;
import com.nvidia.developer.tools.nvtx.NvtxMarker;

import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class MainActivity extends AppCompatActivity {

    private TensorRTEngine engine;
    private ImagePreprocessor preprocessor;
    private TextView resultTextView;
    private ImageView inputImageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化组件
        resultTextView = findViewById(R.id.result_text);
        inputImageView = findViewById(R.id.input_image);

        // 加载TensorRT Engine
        try {
            InputStream engineInputStream = getAssets().open("resnet50_int8.engine");
            ByteBuffer engineBuffer = ByteBuffer.allocate(engineInputStream.available())
                    .order(ByteOrder.nativeOrder());
            engineBuffer.put(engineInputStream.readAllBytes());
            engine = new TensorRTEngine(engineBuffer);
        } catch (IOException e) {
            e.printStackTrace();
            resultTextView.setText("模型加载失败:" + e.getMessage());
            return;
        }

        // 初始化图像预处理(与训练时一致)
        preprocessor = new ImagePreprocessor(224, 224);

        // 测试推理
        testInference();
    }

    private void testInference() {
        // 加载测试图像(assets中的cat.jpg)
        try {
            InputStream imageInputStream = getAssets().open("cat.jpg");
            Bitmap inputBitmap = BitmapFactory.decodeStream(imageInputStream);
            inputImageView.setImageBitmap(inputBitmap);

            // 预处理图像(转换为TensorRT需要的输入格式)
            ByteBuffer inputBuffer = preprocessor.preprocess(inputBitmap);

            // 运行推理
            long startTime = System.currentTimeMillis();
            ByteBuffer outputBuffer = engine.run(inputBuffer);
            long endTime = System.currentTimeMillis();

            // 解析输出(ImageNet的1000类)
            float[] output = new float[1000];
            outputBuffer.order(ByteOrder.nativeOrder()).asFloatBuffer().get(output);
            int predictedClass = argmax(output);
            String className = ImageNetLabels.getLabel(predictedClass);

            // 显示结果
            resultTextView.setText(String.format("预测结果:%s\n推理时间:%dms", className, endTime - startTime));
        } catch (IOException e) {
            e.printStackTrace();
            resultTextView.setText("推理失败:" + e.getMessage());
        }
    }

    private int argmax(float[] array) {
        int maxIndex = 0;
        for (int i = 1; i < array.length; i++) {
            if (array[i] > array[maxIndex]) {
                maxIndex = i;
            }
        }
        return maxIndex;
    }
}
6.2 编写图像预处理类
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.RectF;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class ImagePreprocessor {

    private int inputWidth;
    private int inputHeight;

    public ImagePreprocessor(int inputWidth, int inputHeight) {
        this.inputWidth = inputWidth;
        this.inputHeight = inputHeight;
    }

    public ByteBuffer preprocess(Bitmap bitmap) {
        // 缩放图像到输入尺寸(保持 aspect ratio)
        Bitmap scaledBitmap = scaleBitmap(bitmap, inputWidth, inputHeight);

        // 转换为RGB格式(TensorRT需要RGB输入)
        int[] pixels = new int[inputWidth * inputHeight];
        scaledBitmap.getPixels(pixels, 0, inputWidth, 0, 0, inputWidth, inputHeight);

        // 转换为float数组,并归一化(与训练时一致)
        float[] floatPixels = new float[inputWidth * inputHeight * 3];
        for (int i = 0; i < pixels.length; i++) {
            int pixel = pixels[i];
            floatPixels[i * 3 + 0] = ((pixel >> 16) & 0xFF) / 255.0f * 0.229f + 0.485f;  // R通道
            floatPixels[i * 3 + 1] = ((pixel >> 8) & 0xFF) / 255.0f * 0.224f + 0.456f;   // G通道
            floatPixels[i * 3 + 2] = (pixel & 0xFF) / 255.0f * 0.225f + 0.406f;          // B通道
        }

        // 转换为ByteBuffer(TensorRT需要的输入格式)
        ByteBuffer buffer = ByteBuffer.allocateDirect(floatPixels.length * 4)
                .order(ByteOrder.nativeOrder());
        buffer.asFloatBuffer().put(floatPixels);
        return buffer;
    }

    private Bitmap scaleBitmap(Bitmap bitmap, int targetWidth, int targetHeight) {
        Matrix matrix = new Matrix();
        RectF srcRect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());
        RectF dstRect = new RectF(0, 0, targetWidth, targetHeight);
        matrix.setRectToRect(srcRect, dstRect, Matrix.ScaleToFit.CENTER);
        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
    }
}

步骤7:性能优化

目标:进一步提升端侧推理性能,满足实时性要求。

7.1 优化点1:Batch Size调整

端侧应用通常用batch size=1(实时处理单张图像),但如果是批量处理(比如处理相册中的多张照片),可以适当增大batch size(如4或8),提高GPU利用率。

7.2 优化点2:算子融合

TensorRT会自动进行算子融合(比如把Conv + BatchNorm + ReLU融合成一个算子),减少内存读取次数。可以通过trtexec--verbose参数查看融合情况:

trtexec --loadEngine=resnet50_int8.engine --verbose
7.3 优化点3:内存管理
  • 使用固定内存(Pinned Memory):减少CPU与GPU之间的数据拷贝时间;
  • 复用输入输出缓冲区:避免每次推理都分配新的内存。
7.4 优化点4:硬件加速
  • 启用GPU加速:确保TensorRT使用GPU而不是CPU;
  • 启用FP16混合精度:如果设备支持(如Snapdragon 8 Gen 2),可以将部分算子用FP16计算,进一步提升性能。

步骤8:精度验证与上线

目标:确保量化后的模型在端侧设备上的精度符合要求,并上线运行。

8.1 端侧精度验证

用Android手机拍摄真实图像(比如猫、狗),测试模型的预测结果是否正确。如果出现错误,需要:

  • 检查图像预处理是否正确(比如归一化参数是否与训练时一致);
  • 检查量化过程是否有误(比如校准数据是否足够);
  • 尝试用QAT重新量化模型。
8.2 上线运行

将Android应用打包成APK,发布到应用商店。上线后,需要监控模型的性能(如推理时间、内存占用)和精度(如用户反馈的错误预测),及时调整优化策略。

四、实际应用案例:ResNet-50量化部署到Android手机

4.1 案例背景

某公司开发了一款“智能相册”应用,需要在手机上实时识别照片中的物体(如猫、狗、汽车)。原FP32模型的推理时间为40ms,无法满足实时要求(≤15ms)。

4.2 解决方案

采用本文的8步量化部署流程,将ResNet-50模型量化为INT8,部署到Android手机上。

4.3 结果

  • 模型大小:从100MB压缩到25MB;
  • 推理时间:从40ms缩短到10ms(满足实时要求);
  • 精度:Top-1准确率从78.8%下降到78.5%(用户无感知)。

4.4 常见问题及解决方案

问题 解决方案
精度下降太多(>1%) 增加校准数据量(从100张增加到500张);跳过BatchNorm层的量化;用QAT重新训练。
推理速度没有提升 检查TensorRT是否启用了INT8模式;检查是否使用了GPU加速;优化算子融合。
模型转换失败 检查ONNX模型是否有不支持的算子(如自定义算子);用更高版本的ONNX Runtime和TensorRT。

五、未来展望:量化技术的发展趋势

5.1 更高效的量化方法

  • 混合精度量化:比如权重用INT8,激活用FP16,兼顾性能和精度;
  • 自动量化:用AutoML技术自动选择量化参数(如缩放因子、量化层),减少人工调参的工作量;
  • 大模型量化:针对LLM(如GPT-3、Llama 2)的量化方法(如GPTQ、SmoothQuant),能将模型量化到4位甚至2位,同时保持精度。

5.2 硬件支持的提升

  • 专用量化芯片:比如NVIDIA的Hopper架构支持FP8量化,高通的Hexagon DSP支持INT4量化,进一步提高性能;
  • 跨平台支持:TensorRT、ONNX Runtime等框架将支持更多端侧设备(如iOS、Raspberry Pi)。

5.3 行业应用的爆发

  • 智能终端:手机、智能手表、摄像头等设备将集成更多AI功能(如实时翻译、智能拍照);
  • 工业互联网:边缘设备(如传感器、机器人)将用量化模型实现实时监测和控制;
  • 医疗健康:便携式医疗设备(如血糖监测仪)将用量化模型实现实时诊断。

六、总结与思考

6.1 总结

本文用8个步骤实现了AI原生应用的模型量化部署,核心要点如下:

  1. 选择适合量化的模型,并转成ONNX格式;
  2. 根据模型大小和精度要求,选择PTQ或QAT;
  3. 用ONNX Runtime进行PTQ量化,需要校准数据;
  4. 将ONNX模型转成端侧部署格式(如TensorRT Engine);
  5. 搭建Android部署环境,集成推理引擎;
  6. 优化性能(如batch size调整、算子融合);
  7. 验证端侧精度,上线运行。

6.2 思考问题

  • 如果你的模型是生成式AI(如Stable Diffusion),如何做量化部署?
  • 如果你的设备是iOS(搭载A17 Pro芯片),如何选择部署框架(如Core ML)?
  • 如果你的模型是实时目标检测(如YOLOv8),如何调整量化策略以满足实时性要求?

6.3 参考资源

  • PyTorch Quantization文档:https://pytorch.org/docs/stable/quantization.html
  • ONNX Runtime量化指南:https://onnxruntime.ai/docs/performance/quantization.html
  • TensorRT用户手册:https://docs.nvidia.com/deeplearning/tensorrt/user-guide/index.html
  • 论文:《Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference》(量化的经典论文)

结尾

模型量化部署是AI原生应用的“必经之路”,它能让大模型在端侧设备上“轻装上阵”,实现低延迟、低功耗、高隐私的AI体验。希望本文的8步流程能帮助你解决模型部署的痛点,让你的AI应用“跑”起来!

如果你在实践中遇到问题,欢迎在评论区留言,我们一起讨论解决!

下一篇预告:《大语言模型(LLM)的量化部署:从GPT-3到手机的实现之路》

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐