人工智能大模型机器学习深度学习本地部署模型推理服务【免费下载链接】candleMinimalist ML framework for Rust项目地址https://gitcode.com/GitHub_Trending/ca/candle点击查看免费下载本篇指南以 candle-examples/examples/glm4/README.md 为核心完整讲解如何用 Candle 开源项目自带的glm4示例在 CUDA、Metal 与 CPU 上运行智谱 AI 的 GLM-4 系列模型含新一代 GLM-4-9B-0414 与旧版 GLM-4-9B。读完本文你将掌握--which双架构切换机制、全部命令行参数的含义与默认值、模型权重与分词器的下载/本地加载流程以及示例内部提示词拼接 → 逐 token 采样 → EOS 停止的完整推理链路。GLM-4 双架构背景为什么要区分新旧GLM-4-9B-0414 是智谱 AI 在 GLM-4 系列中推出的新架构模型其模型结构与内部实现与旧版 GLM-4如THUDM/glm-4-9b不兼容。这一点在仓库中有两层直接证据文档层面candle-examples/examples/glm4/README.md 明确指出该模型与之前版本的 GLM-4如 THUDM/glm-4-9b不兼容并要求用户加载时必须显式指定正确的模型类型否则可能引发初始化错误或运行时崩溃源码层面candle-transformers中维护了两套完全独立的实现——glm4.rs旧架构其模块注释自述基于 ChatGLM-6B 的实现与 glm4_new.rs新架构二者配置结构、注意力实现、归一化层布局均不相同。因此在运行示例时--which glm4-old与--which glm4-new分别对应两套代码路径绝不能混用。示例源码中的Which枚举见 main.rs正是为此设计#[derive(Clone, Debug, Copy, PartialEq, Eq, clap::ValueEnum)] enum Which { #[value(name glm4-old)] GLM4Old, #[value(name glm4-new)] GLM4New, }Args::which字段的文档注释还特别警示见 main.rs若未显式指定模型类型默认会落到glm4-old却传入新架构的模型 ID会在模型执行阶段发生运行时 panic。环境准备编译 glm4 示例示例位于candle-examplescrate 中通过 Cargo 的 example 机制运行。编译前需要确认两点Rust 工具链与candle-examples的依赖candle、candle-nn、candle-transformers、hf-hub、tokenizers、clap等均可正常构建依赖声明见 candle-examples/Cargo.toml按目标硬件选择 featurecuda启用 CUDA 后端metal启用 Apple Metal 后端CPU 运行则不加任何 GPU feature。相关 feature 定义见 candle-examples/Cargo.toml。模型权重加载依赖hf-hub从 Hugging Face 拉取文件也可通过--weight-path指定本地权重目录以离线运行。全部命令行参数与默认值示例使用clap解析参数完整定义见 main.rs下表汇总了所有参数及其默认行为参数必填默认值说明--which是无clap 强制要求模型架构类型glm4-old/glm4-new两套架构不兼容必须显式指定--prompt是无输入给模型的用户提示词--model-id否按--which推导远端模型仓库 IDglm4-old默认THUDM/glm-4-9bglm4-new默认THUDM/GLM-4-9B-0414--revision否mainHugging Face 仓库的 revision分支/tag--weight-path否无本地权重目录路径提供后跳过远端下载从该目录读取tokenizer.json、config.json与 safetensors 分片--tokenizer否无自定义分词器文件路径覆盖默认查找逻辑-c, --cache否无hf-hub缓存目录路径自定义下载缓存位置--cpu否false强制使用 CPU 运行--temperature否0.8采样温度--top-p否0.8Nucleus 采样的概率截断阈值--seed否299792458随机采样种子-n, --sample_len否8192最多生成的 token 数--repeat-penalty否1.2重复 token 惩罚系数1.0表示不惩罚--repeat-last-n否64应用重复惩罚时回顾的最近 token 数量--verbose否false打印每个 token 的 ID 与解码内容其中model_id的默认值推导逻辑在源码中清晰可见见 main.rslet model_id match args.model_id.as_ref() { Some(model_id) model_id.to_string(), None match args.which { Which::GLM4Old THUDM/glm-4-9b.to_string(), Which::GLM4New THUDM/GLM-4-9B-0414.to_string(), }, };运行场景一CUDA 在线下载并推理这是文档给出的最直接用法--which区分新旧架构--model-id指定模型仓库权重与配置通过hf-hub自动下载并缓存cargo run --example glm4 --release --features cuda -- --which glm4-new --model-id THUDM/GLM-4-9B-0414 --prompt How are you today? cargo run --example glm4 --release --features cuda -- --which glm4-old --model-id THUDM/glm-4-9b --prompt How are you today?流程内部示例先构造Api可指定-c缓存目录通过repo.get(tokenizer.json)、repo.get(config.json)下载配置再经hub_load_safetensors依据model.safetensors.index.json拉取全部权重分片见 main.rs。模型加载采用unsafe { VarBuilder::from_mmaped_safetensors(filenames, dtype, device) }的 mmap 方式避免整份权重拷贝进内存。一个值得注意的实现细节CUDA 上默认使用 BF16 精度其他设备回退到 F32见 main.rslet dtype if device.is_cuda() { DType::BF16 } else { DType::F32 };运行场景二CUDA 本地权重加载当网络不可用或需要复用已下载的权重目录时用--weight-path指向本地目录示例将从该目录直接读取tokenizer.json、config.json与 safetensors 分片分片清单同样通过model.safetensors.index.json解析见 main.rscargo run --example glm4 --release --features cuda -- --which glm4-new --weight-path /path/GLM-4-9B-0414 --prompt How are you today? cargo run --example glm4 --release --features cuda -- --which glm4-old --weight-path /path/glm-4-9b --prompt How are you today?运行场景三Metal 本地权重加载在 Apple Silicon 上启用 Metal 后端本地权重加载方式与 CUDA 完全一致仅需把 feature 换成metalcargo run --example glm4 --release --features metal -- --which glm4-new --weight-path /path/GLM-4-9B-0414 --prompt How are you today? cargo run --example glm4 --release --features metal -- --which glm4-old --weight-path /path/glm-4-9b --prompt How are you today?运行场景四纯 CPU 推理不加 GPU feature、显式加--cpu即可跑纯 CPU 推理适合无 GPU 环境下的功能验证cargo run --example glm4 --release -- --cpu --which glm4-new --model-id THUDM/GLM-4-9B-0414 --prompt How are you today?设备选择的完整优先级逻辑见 candle-examples/src/lib.rscpu标志优先强制 CPU否则依次探测 CUDA、Metal都不可用时回退 CPU 并打印提示信息。源码级解读示例内部的推理主循环glm4示例的推理逻辑封装在TextGeneration::run中见 main.rs包含几个关键环节1. 提示词拼接。示例会自动将用户提示包装成 GLM 系列约定的对话格式let prompt format!([gMASK]sop|user|\n{}|assistant|, args.prompt);2. 逐 token 生成与 KV 缓存。循环中每次只喂入最后一个 token首轮除外利用模型内部的 KV 缓存做自回归生成Model::Old与Model::New的forward签名不同——旧架构forward(input_ids)新架构forward(input_ids, pos)显式传入位置偏移Model枚举见 main.rs对二者做了统一封装。3. 采样与重复惩罚。LogitsProcessor综合temperature与top_p采样下一个 token当repeat_penalty ! 1.0时会对最近repeat_last_n个 token 施加惩罚见 main.rs。4. EOS 停止条件。EOS token 的确定兼顾新旧架构Config中若带eos_token_id则直接使用否则回退查词表——旧架构用|endoftext|新架构用|user|见 main.rs。EosTokenId支持单值或多值两种形态见 glm4.rs多值时任一命中即停止。5. 性能统计。循环结束后打印生成 token 总数与吞吐率token/s。源码级解读新旧架构实现差异两套模型实现的差异可以落到具体代码旧架构glm4.rs配置字段包括num_layers、padded_vocab_size、hidden_size、ffn_hidden_size、kv_channels、multi_query_attention、multi_query_group_num、rope_ratio等见 glm4.rs延续了 ChatGLM 系列的设计风格并支持multi_query_attention这类经典配置项。其旋转位置编码的 base 为10_000 * rope_ratio见 glm4.rs。新架构glm4_new.rs配置采用更现代的字段集合如head_dim、partial_rotary_factor、num_key_value_heads、sliding_window、tie_word_embeddings、rope_theta、rms_norm_eps见 glm4_new.rs。关键实现特征包括GQA 注意力num_kv_groups num_heads / num_kv_heads通过repeat_kv扩展 KV 头见 glm4_new.rsKV 缓存分块增长KvCache::new(2, 512)以 512 token 为块初始化按需扩容以降低初始内存占用见 glm4_new.rs部分旋转因子partial_rotary_factor可让旋转位置编码只作用于 head_dim 的一部分维度见 glm4_new.rs更深的归一化布局每个 DecoderLayer 含 4 个 RMSNorminput_layernorm、post_attention_layernorm、post_mlp_layernorm、post_self_attn_layernorm采用残差前后双归一化结构见 glm4_new.rs权重共享可选tie_word_embeddings为真时lm_head直接复用 embedding 权重否则独立初始化见 glm4_new.rs统一因果掩码首轮按序列长度构建加性因果掩码后续单 token 步进时无需掩码见 glm4_new.rs。这些差异正是新旧架构必须分开实现、分开加载的底层原因。运行输出解读文档给出的 GLM-4-9B-0414 运行输出如下avx: true, neon: false, simd128: false, f16c: true temp: 0.80 repeat-penalty: 1.20 repeat-last-n: 64 retrieved the files in 158.728989ms loaded the model in 3.714556129s starting the inference loop How are you today? Im just a computer program, so I dont have feelings or emotions. But thank you for asking! How can I assist you today? 31 tokens generated (28.77 token/s)各行的含义第一行是示例启动时打印的 CPU 指令集能力探测结果avx、neon、simd128、f16c用于说明当前构建启用的 SIMD 优化打印逻辑见 main.rs第二行回显采样与惩罚参数temperature、repeat_penalty、repeat_last_nretrieved the files统计权重/分词器等文件获取耗时loaded the model统计权重加载与模型实例化耗时starting the inference loop后先是回显的 prompt随后是模型生成的回答最后一行报告生成的 token 总数与平均生成速度速度受设备、精度CUDA 下 BF16、模型规模与采样参数共同影响。需要说明输出中的具体耗时与吞吐数值取决于运行环境GPU 型号、CPU 算力、磁盘速度等在不同机器上会有差异它们只是该环境下的真实运行记录而非固定指标。常见问题与注意事项务必正确使用--which新旧架构不兼容--which glm4-new搭配旧权重或反之会导致初始化错误、运行时 panic 或输出完全异常CUDA 下默认 BF16如果自定义场景需要 F32 精度需修改 main.rs 中的 dtype 选择逻辑后重新编译仓库只读需在本地副本中调整离线运行无网络环境请使用--weight-path指向完整本地权重目录目录内需包含tokenizer.json、config.json与model.safetensors.index.json及其引用的全部 safetensors 分片内存占用新架构的 KV 缓存按 512 token 分块增长长序列生成时内存会随上下文扩展sample_len默认 8192可按需调小--verbose调试开启后可查看每个 token 的 ID 与解码结果便于排查分词异常或 EOS 提前/未触发问题。赞分享人工智能大模型机器学习深度学习本地部署模型推理服务【免费下载链接】candleMinimalist ML framework for Rust项目地址https://gitcode.com/GitHub_Trending/ca/candle点击查看免费下载相关推荐PyTorch Lightning Fabric 代码组织指南用 LightningModule 分离研究代码与训练逻辑PyTorch Lightning Fabric 代码组织指南用 LightningModule 分离研究代码与训练逻辑 导读 本篇文章聚焦 PyTorch人工智能大模型机器学习深度学习本地部署模型推理服务用 Rust 运行 ConvMixer 图像分类candle-convmixer 示例的架构解析与实战指南用 Rust 运行 ConvMixer 图像分类candle convmixer 示例的架构解析与实战指南 本指南围绕 candle examples/exa人工智能大模型机器学习深度学习本地部署模型推理服务在 Candle 中运行 ConvNeXt 图像分类预训练模型推理实战指南在 Candle 中运行 ConvNeXt 图像分类预训练模型推理实战指南 本指南以 candle examples/examples/convnext ht人工智能大模型机器学习深度学习本地部署模型推理服务上一篇LCD图像转换器嵌入式开发的得力助手下一篇探索技术前沿Hackers - 极简高效的Hacker News阅读神器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考