Unsloth非官方Mac分支体验开箱即用快速开启模型训练1. 为什么Mac用户需要关注这个非官方分支如果你是一位Mac用户特别是使用Apple Silicon芯片M1/M2/M3系列的开发者想要在本地进行大语言模型微调可能已经感受到了深深的挫败感。主流的微调框架要么对Mac支持有限要么配置过程复杂得让人望而却步。Unsloth作为当前热门的LLM微调框架以其2倍训练速度和70%显存降低的特性吸引了大量开发者。但当你兴冲冲地打开官方文档准备在Mac上大展身手时却发现了一个残酷的现实官方主分支明确不支持macOS。这种被排除在外的感觉相信很多Mac开发者都经历过。但今天我要告诉你一个好消息有一个非官方分支已经解决了这个问题而且经过我的实测它真的能用2. 非官方Mac分支的来龙去脉2.1 官方为什么不支持Mac在深入体验之前我们先了解一下背景。Unsloth官方主分支main目前只支持Windows和Linux系统macOS被明确排除在外。这不是开发者对Mac有偏见而是技术实现上的挑战硬件架构差异Apple Silicon芯片M系列采用ARM架构而传统PC使用x86架构GPU加速差异Mac使用Metal框架进行GPU加速而NVIDIA GPU使用CUDA内存管理差异Mac的统一内存架构与传统显存管理方式不同在Unsloth的GitHub仓库中你可以看到从2023年就有人提出增加Mac支持的建议但相关issue至今仍然开放。这说明了技术实现的复杂性。2.2 救星出现shashikanth-a的贡献转机出现在2025年3月。一位名叫shashikanth-a的开发者提交了一个合并请求PR #1289实现了Unsloth在Mac上的部署。这个分支名为apple_silicon_support专门为Apple Silicon芯片优化。虽然这个分支还没有被合并到官方主分支毕竟需要大量测试验证但它提供了一个可用的解决方案。更重要的是这个分支的安装和使用体验相当不错可以说是开箱即用。重要提示使用这个分支时请确保使用apple_silicon_support分支而不是main分支。两者的GitHub地址也不同官方主分支https://github.com/unslothai/unslothMac支持分支https://github.com/shashikanth-a/unsloth/tree/apple_silicon_support3. 环境准备与快速安装3.1 Python版本要求在开始安装之前有一个关键点需要注意Python版本兼容性。当前Unsloth支持的Python版本是3.9到3.12最新的Python 3.13暂时不支持。如果你已经安装了Python 3.13需要降级到3.12。这里我推荐使用conda来管理Python环境因为它能很好地处理版本冲突。# 创建新的conda环境指定Python 3.12 conda create -n unsloth_env python3.12 # 激活环境 conda activate unsloth_env # 如果已经创建了环境但Python版本不对可以强制降级 conda install python3.123.2 两种安装方式对比shashikanth-a的README中提供了两种安装方式我两种都试了下面是我的体验对比方式一Git克隆理论上更规范git clone https://github.com/shashikanth-a/unsloth.git -b apple_silicon_support cd unsloth pip install -e .[huggingface]方式二直接下载ZIP实测更稳定访问 https://github.com/shashikanth-a/unsloth/tree/apple_silicon_support点击绿色的Code按钮选择Download ZIP解压ZIP文件到本地目录进入解压后的目录执行安装我个人的体验是Git克隆方式在某些网络环境下可能会出现问题而直接下载ZIP文件然后安装更加稳定可靠。3.3 安装过程详解无论选择哪种方式安装过程都是一样的。进入项目目录后执行安装命令pip install -e .[huggingface]这个命令会安装一大堆依赖包包括transformersHugging Face的核心库torchPyTorch深度学习框架datasets数据处理库peft参数高效微调库以及其他数十个相关依赖安装过程可能需要5-10分钟具体取决于你的网络速度。安装完成后你可以通过以下命令验证是否安装成功python -m unsloth如果看到Unsloth的相关信息输出说明安装成功了。4. 快速上手你的第一个Mac上的模型微调4.1 理解Unsloth的命令行接口这个Mac分支提供了一个完整的命令行工具让微调变得异常简单。先看看有哪些可用选项python unsloth-cli.py --help这个命令会输出完整的帮助信息涵盖了从模型选择、训练参数到保存选项的所有配置。对于新手来说可能觉得参数太多有点吓人但别担心大部分参数都有合理的默认值。让我帮你梳理一下最重要的几个参数模型相关参数--model_name要微调的模型名称如unsloth/Llama-3.2-3B-Instruct--max_seq_length最大序列长度默认2048--load_in_4bit使用4位量化减少内存占用LoRA相关参数--rLoRA的秩rank默认16--lora_alphaLoRA的alpha参数默认16--lora_dropoutLoRA的dropout率默认0.0训练相关参数--per_device_train_batch_size每个设备的训练批次大小默认2--learning_rate学习率默认2e-4--max_steps最大训练步数4.2 一个完整的微调示例理论说再多不如实际跑一遍。下面是一个完整的示例展示了如何在Mac上微调一个3B参数的模型from unsloth.mlx import mlx_utils from unsloth.mlx import lora as mlx_lora from unsloth import is_bfloat16_supported from transformers.utils import strtobool from datasets import Dataset import logging import os import argparse # 创建参数对象模拟命令行参数 args argparse.Namespace( # 模型配置 model_nameunsloth/Llama-3.2-3B-Instruct, max_seq_length2048, dtypebfloat16 if is_bfloat16_supported() else float16, load_in_4bitTrue, # LoRA配置 r16, lora_alpha16, lora_dropout0.1, biasnone, use_gradient_checkpointingunsloth, random_state3407, use_rsloraFalse, loftq_configNone, # 训练配置 per_device_train_batch_size2, gradient_accumulation_steps4, warmup_steps5, max_steps100, # 为了快速测试设置较小的步数 learning_rate2e-4, optimadamw_8bit, weight_decay0.01, lr_scheduler_typelinear, seed3407, # 输出配置 output_diroutputs, report_totensorboard, logging_steps1, # 保存配置 adapter_fileadapters.safetensors, save_modelTrue, save_methodmerged_16bit, save_ggufFalse, save_pathmodel, quantizationq8_0 ) # 设置日志级别避免过多警告信息 logging.getLogger(hf-to-gguf).setLevel(logging.WARNING) print(正在加载预训练模型这可能需要一些时间...) model, tokenizer, config mlx_utils.load_pretrained( args.model_name, dtypeargs.dtype, load_in_4bitargs.load_in_4bit ) print(模型加载完成) # 定义Alpaca格式的提示模板 alpaca_prompt Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request. ### Instruction: {} ### Input: {} ### Response: {} EOS_TOKEN tokenizer.eos_token # 获取结束标记 def formatting_prompts_func(examples): 格式化训练数据为模型可接受的格式 instructions examples[instruction] inputs examples[input] outputs examples[output] texts [] for instruction, input_text, output in zip(instructions, inputs, outputs): text alpaca_prompt.format(instruction, input_text, output) EOS_TOKEN texts.append(text) return {text: texts} # 创建一个简单的测试数据集 basic_data { instruction: [ 总结以下文本, 翻译成法语, 解释这个概念, 写一首关于...的诗, 列出五个优点, 提供示例 ], input: [ 敏捷的棕色狐狸跳过了懒狗。, Hello world, 机器学习是人工智能的一个子集, 秋天的落叶, 可再生能源, 好的领导品质 ], output: [ 一只狐狸快速跳过了一只狗。, Bonjour le monde, 机器学习是一种AI方法系统从数据中学习模式, 金色的叶子飘落\n在秋风中起舞\n大自然的最后欢呼, 可再生能源可持续、减少污染、创造就业、促进能源独立、运营成本更低。, 好的领导者表现出同理心、清晰沟通、果断、正直和激励他人的能力。 ] } # 转换为HuggingFace数据集格式 dataset Dataset.from_dict(basic_data) print(数据集初始化完成) # 格式化数据 dataset dataset.map(formatting_prompts_func, batchedTrue) print(数据格式化完成准备就绪) # 分割训练集和测试集 datasets dataset.train_test_split(test_size0.33) print(f训练样本数: {len(datasets[train])}, 测试样本数: {len(datasets[test])}) # 开始训练 print(开始训练...) mlx_lora.train_model(args, model, tokenizer, datasets[train], datasets[test])4.3 训练过程解析运行上面的代码你会看到类似下面的输出Trainable parameters: 0.143% (4.588M/3212.750M) Starting training..., iters: 100 Iter 1: Val loss 2.323, Val took 1.660s Iter 1: Train loss 2.401, Learning Rate 0.000e00, It/sec 0.580, Tokens/sec 117.208, Trained Tokens 202, Peak mem 2.661 GB Iter 2: Train loss 2.134, Learning Rate 0.000e00, It/sec 0.493, Tokens/sec 119.230, Trained Tokens 444, Peak mem 2.810 GB Iter 3: Train loss 2.401, Learning Rate 0.000e00, It/sec 0.539, Tokens/sec 108.948, Trained Tokens 646, Peak mem 2.810 GB让我解释一下这些输出的含义可训练参数比例0.143%意味着只有很小一部分参数需要更新这是LoRA技术的核心优势损失值Loss衡量模型预测与真实值的差异值越小越好迭代速度It/sec表示每秒处理的迭代次数Token处理速度Tokens/sec表示每秒处理的token数量峰值内存训练过程中使用的最大内存对于Mac用户来说特别重要5. 实际体验与性能分析5.1 安装体验真的开箱即用吗经过我的实际测试这个非官方分支的安装体验可以打8分满分10分。优点很明显优点依赖自动处理pip install -e .[huggingface]一句命令搞定所有依赖环境隔离好使用conda环境可以避免版本冲突错误信息清晰如果出现问题错误信息通常能指出具体原因需要注意的地方Python版本必须使用3.9-3.12不能使用3.13网络环境下载模型和依赖需要稳定的网络磁盘空间完整安装需要约5-10GB空间5.2 训练性能在Mac上能跑多快我在M2 Max32GB内存的MacBook Pro上进行了测试以下是我的观察内存使用情况加载3B参数模型约2.5GB内存开始训练后峰值约2.8GB内存整体内存占用控制在3GB以内训练速度Token处理速度约100-120 tokens/秒迭代速度约0.5-0.6次/秒对于小型数据集几百条样本几分钟就能完成微调与官方版本的对比 虽然这个Mac分支的性能可能不如在NVIDIA GPU上的官方版本但对于个人学习和实验来说完全够用。更重要的是它让Mac用户能够参与到LLM微调的实践中来。5.3 功能完整性支持哪些特性这个非官方分支基本实现了官方版本的核心功能已支持的功能LoRA微调参数高效微调4位量化加载梯度检查点多种优化器AdamW 8-bit等学习率调度模型保存支持多种格式可能有限制的功能某些高级优化可能不如CUDA版本完善超大模型70B的支持可能有限多GPU训练支持可能不如官方版本6. 实用技巧与常见问题6.1 如何选择适合的模型对于Mac用户模型选择特别重要。以下是我的建议推荐模型Llama-3.2-3B-Instruct3B参数适合大多数Mac配置Qwen2.5-3B-Instruct中文支持好性能平衡Gemma-2B更小的模型训练速度更快不推荐的模型70B以上的大模型内存要求太高非指令微调版本需要更多数据准备6.2 内存优化技巧即使有Unsloth的优化在Mac上训练大模型仍然需要注意内存管理# 技巧1使用4位量化 args.load_in_4bit True # 技巧2调整批次大小 args.per_device_train_batch_size 1 # 如果内存不足可以减小批次大小 # 技巧3使用梯度累积 args.gradient_accumulation_steps 8 # 模拟更大的批次大小 # 技巧4限制序列长度 args.max_seq_length 1024 # 如果不是处理长文本可以减小序列长度6.3 常见问题与解决方案问题1安装时出现版本冲突解决方案使用conda创建干净的环境确保Python版本为3.12问题2训练时内存不足解决方案减小批次大小、使用4位量化、减小序列长度问题3训练速度太慢解决方案确保使用Metal加速、关闭其他占用资源的应用、使用更小的模型问题4保存模型失败解决方案检查磁盘空间、确保有写入权限、尝试不同的保存格式6.4 进阶使用自定义数据集上面的示例使用了简单的内置数据集实际应用中你需要使用自己的数据。这里是一个自定义数据集的示例import pandas as pd from datasets import Dataset # 从CSV文件加载数据 df pd.read_csv(your_data.csv) # 转换为HuggingFace数据集格式 custom_dataset Dataset.from_pandas(df) # 确保数据有正确的列名 # 需要包含instruction, input, output 三列 # 如果没有input列可以创建一个空列 if input not in custom_dataset.column_names: custom_dataset custom_dataset.add_column(input, [] * len(custom_dataset)) # 格式化数据 custom_dataset custom_dataset.map(formatting_prompts_func, batchedTrue) # 分割数据集 datasets custom_dataset.train_test_split(test_size0.1, seed42)7. 总结与展望7.1 这个非官方分支的价值经过详细的测试和使用我认为shashikanth-a的apple_silicon_support分支为Mac用户带来了实实在在的价值降低了门槛让没有NVIDIA GPU的开发者也能体验LLM微调保持了易用性安装和使用过程相对简单性能可接受对于学习和实验目的完全够用社区贡献体现了开源社区的力量和协作精神7.2 给Mac用户的建议如果你是一位Mac用户想要开始LLM微调之旅我的建议是适合的场景学习和实验LLM微调技术小规模数据集的微调实验原型开发和概念验证教学和演示目的需要谨慎的场景大规模生产环境训练需要极致训练速度的项目处理超大规模数据集7.3 未来展望这个非官方分支目前还处于测试阶段但它展示了在Mac上进行LLM微调的可行性。随着Apple Silicon芯片的不断升级和MLX框架的完善我相信性能会进一步提升M3、M4芯片的性能提升会直接反映在训练速度上官方支持可能到来如果这个分支经过充分测试可能会被合并到官方主分支生态会更加完善更多工具和库会加入对Mac的原生支持7.4 最后的建议对于想要尝试的开发者我建议从简单开始先用小模型和小数据集熟悉流程做好备份重要的数据和模型做好备份参与社区如果遇到问题可以在GitHub issue中寻求帮助分享经验如果你有好的使用经验不妨分享给社区LLM微调不再是高端GPU的专属随着工具的发展越来越多的开发者能够在自己的设备上探索这个令人兴奋的领域。这个Unsloth的Mac分支正是这个趋势的一个很好体现。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。