本文详细介绍如何在Mac电脑上使用Apple的MLX框架,通过LoRA(低秩适配)技术对大语言模型(如Qwen3-4B-Instruct)进行微调。以下流程适用于8月9日的Mac mini M4 16GB,涵盖模型获取、数据准备、微调、运行及模型合并等步骤。

获取模型

目前主流的大模型下载平台有 ModelScope(国内)Hugging Face(国外),它们都提供了方便的命令行工具以及 Git 仓库下载方案,方便用户快速获取模型权重和相关资源。

使用 Git 下载模型

确保你的 Mac 电脑已经安装了 brew,如果还没安装,可以访问 https://brew.sh/ 按照官方指南安装。
之后安装 Git 以及 Git LFS(Large File Storage)工具,方便管理大文件:

brew install git git-lfs
git lfs install

下载 ModelScope 上的模型仓库示例:

git clone https://www.modelscope.cn/Qwen/Qwen3-4B-Instruct-2507.git

下载 Hugging Face 上的模型仓库示例:

git clone https://huggingface.co/Qwen/Qwen3-4B-Instruct-2507

使用命令行工具下载模型

推荐使用独立的 Python 虚拟环境(virtualenv、venv 或 conda),避免污染基础环境。

使用 ModelScope 命令行工具下载:

# 安装 ModelScope
pip install modelscope
# 下载模型
modelscope download --model Qwen/Qwen3-4B-Instruct-2507 --local-dir ./Qwen3-4B-Instruct-2507

使用 Hugging Face Hub 命令行工具下载:

# 安装 Hugging Face Hub CLI
pip install -U "huggingface_hub[cli]"
# 下载模型
hf download Qwen/Qwen3-4B-Instruct-2507 --local-dir ./Qwen3-4B-Instruct-2507

安装 MLX-LM

为了确保后续内容可以正常展开,请你自行创建虚拟环境,安装mlx-lm及其训练依赖项

pip install "mlx-lm[train]"
  • MLX-LM直接支持Hugging Face格式模型(包含权重和配置文件),无需转换为MLX格式。

  • Hugging Face 格式是主流模型的“原始格式”,表现为一个文件夹,其中存储训练好的模型参数和配置信息,通常由多个文件组成,适合训练和跨平台使用,结构灵活,通用性强。

  • MLX 格式是针对 MLX 框架专门设计的“一体化格式”,表现为一个文件夹,把模型权重和部分信息打包成单个文件,更加轻量和高效,方便快速加载、微调和量化推理。

运行模型

MLX-LM 提供了命令行工具可以直接运行我们的大模型

mlx_lm.generate --model ./Qwen3-4B-Instruct-2507 --prompt "你谁"

MLX-LM 提供了python接口,可以通过脚本运行模型

from mlx_lm import load, generatemodel, tokenizer = load("./Qwen3-4B-Instruct-2507")prompt = "你谁"messages = [{"role": "user", "content": prompt}]
prompt = tokenizer.apply_chat_template(messages, add_generation_prompt=True
)text = generate(model, tokenizer, prompt=prompt, verbose=True)

运行结果示例

==========
我是通义千问,是阿里云研发的超大规模语言模型。我可以帮助你回答问题、创作文字、编程、表达观点等。有什么我可以帮你的吗?
==========
Prompt: 10 tokens, 42.522 tokens-per-sec
Generation: 38 tokens, 11.952 tokens-per-sec
Peak memory: 8.287 GB

准备微调数据

创建数据目录

mkdir data && cd data

这里新建一个专门存放训练和验证数据的文件夹,方便统一管理,避免杂乱。

创建训练数据文件 train.jsonl

cat > train.jsonl << 'EOL'
{"text": "<|im_start|>user\n你是谁?<|im_end|>\n<|im_start|>assistant\n你好,我是touken,一个专注于地理信息系统的智能助手,很高兴为你服务。<|im_end|>"}
{"text": "<|im_start|>user\n请介绍一下GIS。<|im_end|>\n<|im_start|>assistant\nGIS,全称地理信息系统,是一种用来采集、管理和分析空间数据的工具。需要帮助的话,告诉我!<|im_end|>"}
{"text": "<|im_start|>user\ntouken,什么是空间数据建模?<|im_end|>\n<|im_start|>assistant\n空间数据建模是将地理现象转化为数学模型,方便分析和预测地理变化。希望这个解释清楚明了。<|im_end|>"}
{"text": "<|im_start|>user\n有哪些常用的GIS软件?<|im_end|>\n<|im_start|>assistant\n常用的GIS软件包括ArcGIS、QGIS和MapInfo。这些工具可以帮助你处理空间数据。<|im_end|>"}
EOL

训练数据是模型学习的基础,格式为 JSONL,确保每行是一个完整的 JSON 对象,字段为 text
这里用 Qwen 规范的对话格式明确区分用户和助手,有助于模型理解上下文关系,提升微调效果。

创建验证数据文件 valid.jsonl

cat > valid.jsonl << 'EOL'
{"text": "<|im_start|>user\n你是谁?<|im_end|>\n<|im_start|>assistant\n我是touken,专业的地理信息助手,随时为你解答相关问题。<|im_end|>"}
{"text": "<|im_start|>user\n什么是GIS?<|im_end|>\n<|im_start|>assistant\nGIS是地理信息系统,用于管理和分析空间数据。<|im_end|>"}
{"text": "<|im_start|>user\ntouken,什么是空间数据建模?<|im_end|>\n<|im_start|>assistant\n空间数据建模是将地理现象转化为数学模型,用于空间分析。<|im_end|>"}
{"text": "<|im_start|>user\n有哪些常用的GIS软件?<|im_end|>\n<|im_start|>assistant\nArcGIS和QGIS是常见GIS软件。<|im_end|>"}
EOL

验证数据用于在训练过程中评估模型性能,帮助判断是否过拟合或欠拟合。
格式要求与训练数据一致,保证数据规范统一。

数据格式要求

  • JSONL格式:每行一个完整JSON对象,包含text字段。
  • Qwen对话格式
    • 用户:<|im_start|>user\n问题<|im_end|>
    • 助手:<|im_start|>assistant\n回答<|im_end|>
  • 必需文件:train.jsonl(训练集)和valid.jsonl(验证集)。
  • 参考MLX官方文档(https://github.com/ml-explore/mlx-examples)获取更多格式支持。

创建微调参数配置

虽然我们可以通过命令行参数直接配置并开始微调,但是效果并不直观,下面给出了lora_config.yaml用于从配置文件加载微调任务

# 基础模型路径
model: "./Qwen3-4B-Instruct-2507"  # 预训练模型所在路径train: true  # 是否进行训练,true 表示开始微调fine_tune_type: lora  # 微调方法,使用 LoRA 轻量化微调optimizer: adamw  # 优化器,AdamW 在大模型微调中表现良好# 数据集路径
data: "./data"  # 训练和验证数据所在文件夹路径,需包含格式合适的数据文件# 随机种子,保证可复现
seed: 0# 模型层数,部分模型需要指定微调层数
num_layers: 16  # 微调的模型层数,建议根据模型规模调整# 训练参数
batch_size: 1  # 每个训练步骤使用的样本数,较小批量可节省显存,但训练不稳定
iters: 50  # 训练的迭代次数,次数过少会导致模型未充分学习learning_rate: 1e-5  # 学习率,较小学习率更稳定但训练慢,过小可能导致效果不明显steps_per_report: 1  # 每多少步打印训练日志steps_per_eval: 5  # 每多少步进行一次评估# LoRA 适配器路径,保存微调权重
adapter_path: "adapters"# 每多少步保存一次微调模型
save_every: 5# LoRA 相关超参数
lora_parameters:keys: ["self_attn.q_proj", "self_attn.v_proj"]  # 选择微调的注意力层权重rank: 8  # LoRA 的秩,越大表示更强的适应能力,但显存和计算开销也增大scale: 20.0  # 缩放因子,控制 LoRA 参数的幅度dropout: 0.0  # dropout 比例,适当加大可防止过拟合

请注意,当前项目包含以下内容:

.
├── Qwen3-4B-Instruct-2507/          # 模型文件目录(通过 Git LFS 或 modelscope 等下载)
├── data/                            # 数据文件目录
│   ├── train.jsonl                  # 训练数据集(JSON Lines 格式)
│   └── valid.jsonl                  # 验证数据集(JSON Lines 格式)
├── lora_config.yaml                 # LoRA 微调配置文件

进行 Lora 微调

输入下面的命令即可开始

mlx_lm.lora --config ./lora_config.yaml

微调完毕后将微调参数将会被放置在adapters文件夹下

Loading configuration file ./lora_config.yaml
Loading pretrained model
Loading datasets
Training
Trainable parameters: 0.033% (1.311M/4022.468M)
Starting training..., iters: 20
Calculating loss...: 100%|██████████████████████████████████████████████████████████████████████████████████████| 4/4 [00:00<00:00,  5.76it/s]
Iter 1: Val loss 7.973, Val took 0.708s
Iter 1: Train loss 7.321, Learning Rate 1.000e-05, It/sec 3.434, Tokens/sec 154.528, Trained Tokens 45, Peak mem 8.311 GB
略........................
Iter 50: Train loss 0.885, Learning Rate 1.000e-05, It/sec 3.658, Tokens/sec 135.350, Trained Tokens 1858, Peak mem 8.327 GB
Iter 50: Saved adapter weights to adapters/adapters.safetensors and adapters/0000050_adapters.safetensors.
Saved final weights to adapters/adapters.safetensors.

运行微调后的模型

在命令行后增加--adapter-path指定即可

mlx_lm.generate --model ./Qwen3-4B-Instruct-2507 --adapter-path ./adapters --prompt "你谁"

代码同理

from mlx_lm import load, generatemodel, tokenizer = load("./Qwen3-4B-Instruct-2507", adapter_path="./adapters")prompt = "你谁"messages = [{"role": "user", "content": prompt}]
prompt = tokenizer.apply_chat_template(messages, add_generation_prompt=True
)text = generate(model, tokenizer, prompt=prompt, verbose=True)

运行结果如下

==========
你好,我是touken,一个专注于地理信息系统的智能助手。很高兴为你服务!
==========
Prompt: 10 tokens, 51.333 tokens-per-sec
Generation: 20 tokens, 12.392 tokens-per-sec
Peak memory: 8.296 GB

合并LoRA权重到基础模型

将微调权重合并,生成带微调结果的完整模型:

mlx_lm.fuse \--model ./Qwen3-4B-Instruct-2507 \--adapter-path ./adapters \--save-path ./Qwen3-4B-touken
  • --save-path 指定合并后的模型保存目录。

合并后可直接使用:

mlx_lm.generate --model ./Qwen3-4B-touken --prompt "你是谁?"

总结

通过MLX框架和LoRA技术,16GB的Mac电脑可高效微调Qwen3-4B-Instruct模型(约40亿参数)。关键步骤包括:

  1. 使用Git LFS或命令行工具从ModelScope/Hugging Face下载模型。
  2. 安装mlx-lm并准备JSONL格式的训练和验证数据。
  3. 配置LoRA参数并执行微调,内存占用约8GB。
  4. 运行或合并微调模型,优化地理信息系统相关任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94865.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94865.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94865.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

润乾报表、帆软报表的开源替代品—JimuReport(积木报表)

国产报表工具选型指南&#xff1a;润乾报表 vs 积木报表&#xff08;JimuReport&#xff09; 如果你在寻找润乾报表、帆软报表的替代产品&#xff0c;JimuReport&#xff08;积木报表&#xff09;是一个值得考虑的选择。它不仅功能全面&#xff0c;而且操作简单&#xff0c;非常…

Tiger任务管理系统-12

今天整了一个老虎网站介绍这套任务管理开源系统&#xff0c;防止链接丢失&#xff0c;体验了一把AI编程&#xff0c;虽说确实省了很多事&#xff0c;但源码确实不敢恭维&#xff0c;尤其是修改的时候&#xff0c;真心累&#xff0c;所以还是要自己掌握核心&#xff0c;AI一时爽…

智慧农业-无人机视角庄稼倒伏农作物倒伏识别分割数据集labelme格式541张1类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件)图片数量(jpg文件个数)&#xff1a;541标注数量(json文件个数)&#xff1a;541标注类别数&#xff1a;1标注类别名称:["fall"]每个类别标注的框数&#xff1a;fall co…

电子电气架构 --- 电气/电子架构迁移已拉开帷幕

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

PPT漏斗图,让数据更美观!

PPT漏斗图制作全攻略&#xff1a;从入门到精通的实用技巧和模板推荐 无论你是职场新人还是PPT老手&#xff0c;在做数据报告或者展示项目进度的时候&#xff0c;你总觉得图表太单调&#xff0c;数据太复杂吗&#xff1f;这时&#xff0c;一张逻辑清晰、结构简单的漏斗图&#…

深入解析C++流运算符(>>和<<)重载:为何必须使用全局函数与友元机制

目录 一、为什么需要重载为全局函数 成员函数重载的问题 全局函数的优势 二、实现细节 1、输出运算符<<的重载 关键部分详解 1. 类定义部分 2. 运算符重载实现 3. main函数中的使用 为什么这样设计&#xff1f; 执行流程 输出结果 2、输入运算符>>的重…

ENS-317 Modbus TCP / 通用模式网关

在工业自动化的复杂网络中&#xff0c;以太网设备与串口设备的 “语言不通” 常常成为数据流转的阻碍。上海泗博自动化推出的 ENS-317 Modbus TCP / 通用模式网关&#xff0c;以强大的协议转换能力、灵活的配置方式和工业级可靠性&#xff0c;为设备互联提供一站式解决方案&…

AcWing 6478. 谁进线下了?III

原题链接 6478. 谁进线下了&#xff1f;III - AcWing题库 这是一道睿抗&#xff08;省赛&#xff09;题 一开始睿抗是啥都不知道 然后一看是省赛吓得我不轻 但读完题简简单单 一道很水的模拟题&#xff08;谁能解释一下睿抗啥意思&#xff09; 一起开康康 题目 Xepa Le…

openpnp - 不连接设备,只大概测试一下摄像头是否好使

文章目录openpnp - 不连接设备&#xff0c;只大概测试一下摄像头是否好使概述笔记备注备注ENDopenpnp - 不连接设备&#xff0c;只大概测试一下摄像头是否好使 概述 顶部相机摄像头在拆装过程中&#xff0c;可能被手上的静电打坏了。 现在和电脑连接是正常的&#xff0c;但是…

使用Python提取PDF大纲(书签)完整指南

&#x1f50d; 一、PDF大纲简介&#x1f4cc; ​PDF大纲&#xff08;Outline&#xff09;​​ 是PDF文档中的导航结构&#xff0c;通常显示在阅读器的侧边栏中&#xff0c;方便用户快速跳转到文档的不同部分。大纲通常以层级结构组织&#xff0c;包含标题和对应的页面位置。本文…

第39周——训练自己的数据集

目录 1. 下载数据 2. 配置开发环境 3. 预处理数据 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 1. 下载数据 百度网盘&#xff1a;百度网盘 请输入提取码 压缩文件中有两个文件夹&#xff0c;分别是Annot…

CentOS7中Docker的安装与卸载

CentOS7 从零开始:Docker 安装与卸载全指南(新手友好版) 作为一名刚接触 Linux 和容器技术的新手,你是否曾在安装 Docker 时被各种命令和报错搞得一头雾水?比如执行 yum install docker 时提示 “仓库不存在”,或者启动 Docker 后用 docker version 只显示 client 不显示…

解决MinIO上传图片后返回URL无法访问的问题

一、问题现象 上传接口返回了文件的访问路径&#xff0c;比如&#xff1a; http://127.0.0.1:9005/lease/20250808/xxx-uuid.png但是用浏览器直接打开该地址却显示权限拒绝,前端也访问不到:二、问题原因分析 桶权限设置不正确: MinIO默认桶权限是私有的&#xff0c;即使浏览器能…

系统网络端口安全扫描脚本及详解

#!/bin/bash # 系统服务端口安全扫描 - 修正版echo " 系统服务端口安全扫描报告 "# 1. 高风险端口识别 echo "⚠️ 对外开放的高风险端口:" awk /0.0.0.0:21/ {print " 端口 21 - FTP (明文传输)\n &#x1f6a8; 严重安全风险&#xff0c;建议…

DAY 39 图像数据与显存

知识点回顾 图像数据的格式&#xff1a;灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 一、 图像数据的介绍 1.1 灰度图像 从这里开始我们进入到了图像数据相关的部分&#xff0c;也是默认…

从大数据视角理解时序数据库选型:为何选择 Apache IoTDB?

目录一、什么是时序数据库&#xff1f;为什么你需要它&#xff1f;&#x1f527;典型应用场景&#xff1a;二、时序数据库选型维度有哪些&#xff1f;三、为什么推荐 Apache IoTDB&#xff1f;&#x1f9e0; Apache 顶级项目&#xff0c;工业 IoT 场景原生支持&#x1f680; 性…

[ MySQL 数据库 ] 环境安装配置和使用

目录 一. 数据库(DataBase) 1.定义: 2. 常见的数据库产品&#xff1a; 3. MySQL数据库 (1). 介绍 : (2). cmd命令行方式连接 MySQL (3). MySQL的常用命令 二. MySQL数据库 环境安装及配置 三. SQL 1.定义 : 2. DDL (1)数据库 (2)数据表 1. 字段(列)和记录(行) 2. 表特征 3.…

Numpy科学计算与数据分析:Numpy布尔索引与花式索引实战

Numpy高级索引 学习目标 通过本课程&#xff0c;学员将掌握Numpy中布尔索引和花式索引的使用方法&#xff0c;能够灵活运用这些高级索引技术进行复杂的数据操作和处理。 相关知识点 Numpy高级索引 学习内容 1 Numpy高级索引 1.1 布尔索引 布尔索引是Numpy中一种非常强大…

【Linux】patch补丁的生成与使用方法总结

引言 在 Linux 和开源世界中&#xff0c;patch 是一个极其强大且常用的工具。它允许开发者和系统管理员以增量方式修改文件&#xff0c;特别适用于源代码的更新、错误修复、功能补丁的分发与应用。 目录 引言 一、patch介绍 二、生成补丁文件 三、补丁文件内容解析 四、p…

杂谈 001 · VScode / Copilot 25.08 更新

原文链接https://www.castamerego.com/blog/talk-001 2025.08.08 , VS code 发布八月更新&#xff0c;同一天 Copilot 也更新了 GPT-5, 浅体验一下 VS code 更新 发行说明更新页面内跳转显示 AI 比例页面内跳转 Copilot 更新 对话回溯 checkpoints页面内跳转进度列表页面内…