type
status
date
slug
summary
tags
category
icon
password
本文通过大模型初识、搭建训练环境、常用 Linux 命令、安装机器学习框架、微调模型等内容,为大家带来零基础的大语言模型本地部署、微调、知识库搭建教学。不要有畏难的情绪,这只是一个熟悉的过程,多跑几次之后,整个流程就很亲切了。
本文共 13195 字。
大模型初识
大模型的定义
大模型是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数。大模型的设计目的是为了提高模型的表达能力和预测性能,能够处理更加复杂的任务和数据。大模型在各种领域都有广泛的应用,包括自然语言处理、计算机视觉、语音识别和推荐系统等。大模型通过训练海量数据来学习复杂的模式和特征,具有更强大的泛化能力,可以对未见过的数据做出准确的预测。
ChatGPT 对大模型的解释更为通俗易懂,也更体现出类似人类的归纳和思考能力:大模型本质上是一个使用海量数据训练而成的深度神经网络模型,其巨大的数据和参数规模,实现了智能的涌现,展现出类似人类的智能。
那么,大模型和小模型有什么区别?
小模型通常指参数较少、层数较浅的模型,它们具有轻量级、高效率、易于部署等优点,适用于数据量较小、计算资源有限的场景,例如移动端应用、嵌入式设备、物联网等。
而当模型的训练数据和参数不断扩大,直到达到一定的临界规模后,其表现出了一些未能预测的、更复杂的能力和特性,模型能够从原始训练数据中自动学习并发现新的、更高层次的特征和模式,在未直接训练过的任务上表现出惊人性能。这种能力被称为涌现能力。而具备涌现能力的机器学习模型就被认为是独立意义上的大模型,这也是其和小模型最大意义上的区别。
相比小模型,大模型通常参数较多、层数较深,具有更强的表达能力和更高的准确度,但也需要更多的计算资源和时间来训练和推理,适用于数据量较大、计算资源充足的场景,例如云端计算、高性能计算、人工智能等。
大模型概念区分
大模型(Large Model,也称基础模型,即 Foundation Model):具有大量参数和复杂结构的机器学习模型,能够处理海量数据、完成各种复杂的任务,如自然语言处理、计算机视觉、语音识别等。
超大模型:超大模型是大模型的一个子集,它们的参数量远超过大模型。
大语言模型(Large Language Model):通常是具有大规模参数和计算能力的自然语言处理模型,例如 OpenAI 的 GPT-3 模型。这些模型可以通过大量的数据和参数进行训练,以生成人类类似的文本或回答自然语言的问题。大型语言模型在自然语言处理、文本生成和智能对话等领域有广泛应用。
GPT(Generative Pre-trained Transformer):GPT 和 ChatGPT 都是基于 Transformer 架构的语言模型,但它们在设计和应用上存在区别:GPT 模型旨在生成自然语言文本并处理各种自然语言处理任务,如文本生成、翻译、摘要等。它通常在单向生成的情况下使用,即根据给定的文本生成连贯的输出。
ChatGPT:ChatGPT 则专注于对话和交互式对话。它经过特定的训练,以更好地处理多轮对话和上下文理解。ChatGPT 设计用于提供流畅、连贯和有趣的对话体验,以响应用户的输入并生成合适的回复。
微调相关概念
微调:厂商把大模型训练出来,就好比大学生顺利毕业了。他具备了一定的通用技能,但是要入职、上岗,还得接受公司的岗前培训。这种公司的培训其实就是微调,让大模型这个新人能够快速掌握一些特定的技能。
Lora 和 QLora:如果把大模型比作一本百科全书的话,微调并不是把这本书重新写一遍,而是在一些页面上贴便签纸,在上面写一些额外的信息,Lora 就是这样的便签纸。而 QLora 则更进一步,可以在更小的纸片上写更多的字。
数据集:大模型要接受岗前培训、上岗培训,数据集就是培训的教材。你可以用自己的数据做成数据集的格式,也可以用公开数据集。
SFTTrainer:对使用者来说,SFTTrainer 是训练工具。它简化了微调的过程,提供了很多设置和优化的选项。对大模型来说,它就好比是培训班的老师,接收了大模型这些学生,并且拿到了数据集作为教材,然后开始教大模型如何更好地执行特定的任务。
过度拟合:我们应该都遇到过那些读书读过头的人,他们考试非常厉害,但是一旦遇到教材里没有教的问题就不会了。同样,大模型也存在这种可能性,只会应对数据集中训练过的情况,而在举一反三的预测上无法得到理想的答案。这种死读书的结果就叫过度拟合。
根据以上五个概念,我们可以得出大模型微调的两个关键:数据集质量和训练质量。
搭建训练环境
假设你使用的计算机性能还过得去,搭载 Windows 操作系统,并且剩余不少于 40 GB 的存储空间。
如果你是优雅 の Mac 用户,可以看看 Apple 开源的 MLX 框架。
如果你是 Linux 玩家,那你一定是大佬,请受我一拜!
如果你的计算机性能过不去,可以尝试 GPU 云服务器,以按量付费的方式来训练模型。好的平台我比较推荐 GPUEZ,能以更低廉的价格(每小时一杯珍珠奶茶)租用更高的算力。我没恰饭,仅此一广。
WSL
由于大量的开源项目和机器学习框架是在 Linux 上开发的,比如大名鼎鼎的 Unsloth 就写明了,不支持在 Windows 上直接运行,而是要通过 WSL 运行:
对于我们这些新手来说,强行在 Windows 上折腾这些项目的移植版本,无疑是给自己找麻烦。好在微软提供了 WSL,把 Linux 变成 Windows 的一个子系统,这让我们可以很方便地在 Windows 上使用 Linux。
WSL 很容易安装,按 Win+S 打开搜索栏,搜索并打开
启用或关闭 Windows 功能
,在弹出的窗口中勾选适用于 Linux 的 Windows 子系统
和虚拟机平台
,点击确定
,然后按照提示重启电脑即可。我们需要确认 WSL 是否成功安装。按下 Win+R,在“运行”窗口中输入
cmd
,然后按 Enter。在弹出的命令提示符中执行这行命令:
如果打印帮助信息,说明安装成功。
WSL 有两个版本,WSL 2.0 相比 WSL 1.0 具备完整的 Linux 内核、托管 VM 和完全的系统调用兼容性。
我们这里设置 WSL 默认版本为 WSL 2:
Linux
Linux 作为一个开源的操作系统,有很多发行版本,其中 Ubuntu 被公认为最好用的 Linux 发行版之一。我们以 Ubuntu 作为示例。
Ubuntu 是世界上最受欢迎的 Linux 操作系统。—— Ubuntu 官网
安装方法很简单,我们在刚刚的命令提示符中执行这行命令:
等待一会儿,安装完成后,命令提示符会打印以下内容:
此时要求创建一个用户。输入用户名,然后按 Enter。
然后会要求输入密码并重复输入:
要注意的是,密码在命令行模式下输入是看不见的,所以只要输入两次相同的密码就可以。
如果打印了类似下面的消息,说明你已经成功在自己的计算机上安装 Linux 了:
消息中提到,如果你不希望每天打开 Linux 时都出现上面的消息,可以执行以下命令:
这里命令行开头的 $ 是普通用户的终端命令提示符,可以看作 zzzhizhi@ZhizhiPC:~$ 最后的 \$,表示 Linux 命令行中的命令。实际输入命令时不要输入 $。 touch 命令用于新建一个文件。 ~ 表示当前用户的用户目录。 .hushlogin 是文件名。
如果想要关闭 Linux,可以执行以下命令:
后续想要再次打开时,可以进入命令提示符后按下图操作,也可以直接在应用列表中打开 Ubuntu。
迁移 WSL 安装目录
此时的 WSL 默认安装在 C 盘。随着系统的使用,会占用 C 盘的空间。所以我们最好将其迁移到其它磁盘分区下。如果你喜欢放在 C 盘,且 C 盘空间充足,可以跳过这一部分。
首先,我们要查看当前的 WSL 发行版名称。在命令提示符中执行命令:
可以看到,我的 WSL 发行版就叫 Ubuntu。
接着,将发行版导出为 .tar 文件:
然后,注销当前发行版:
此后,重新导入并安装 WSL:
紧接着,设置默认用户为安装时的用户:
最后,删除 .tar 文件,如果你觉得它不会再有什么用的话:
经过以上操作后,就将 WSL 的默认安装目录迁移到你的指定新目录(示例中是 D:\WSL_Ubuntu)下了。此目录即为 WSL 的根文件系统目录。
恭喜,万里长征走完第一步!
安装机器学习框架
查看 GPU
右击任务栏上的
开始
,选择设备管理器
。查看
显示适配器
下拉菜单,判断你的计算机符合以下哪一项:- NVIDIA GPU:有 NVIDIA 独立显卡。
- AMD GPU:没有 NVIDIA 独立显卡,有 AMD 独立显卡。
- CPU:以上两者都不符合。
Linux 初体验
第一次进入 Linux 需要我们先记住几个常用的命令。
不需要刻意记忆,多上手自会熟能生巧。
- pwd 查看当前的目录路径
- ls 列出当前目录下的所有文件和目录
- cd 进入指定目录
- mkdir 新建目录
- rm 删除
- mv 移动、重命名
- wget 下载文件
- apt 软件包管理器
- vim 常用的文本编辑器
慎用快捷键!Linux 中的快捷键和 Windows 有很大的区别,例如 Ctrl+C、Ctrl+D 和 Ctrl+Z 都有退出的功能。如果要复制粘贴,请按下鼠标右键。
安装好的 Linux 默认语言为英文。为了便于上手,我们将其设置为中文。
首先查看是否安装了中文语言包:
locale 是 Linux 系统中多语言环境的设置接口,在 Linux 中,使用 locale 命令来设置和显示程序运行的语言环境,locale 会根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统定义一个软件运行时的语言环境。
查看打印的列表中是否有
zh_CN.utf8
。如果没有,首先需要安装中文语言包:apt-get 与 apt 相似,都是对 Ubuntu 默认软件包管理器的操作命令。install 参数用于安装指定软件包,需要超级用户权限。-y 参数表示忽略确认请求,默认通过。
Linux 等类 Unix 系统中的超级用户是 root,类似于 Windows 中的 Administrator。它是用于系统管理的系统上具有最高访问权限的特权帐户。此根/超级用户帐户的用户标识符(UID)为 0,无论帐户名称如何。 root 用户拥有整个系统的完全权限,它可以做诸如修改系统的核心部分、升级系统、更改系统配置以及启动、停止和重新启动所有正在运行的系统服务之类的事情。root 用户的终端命令提示符是 #。 sudo (super user do) 命令是一个命令行实用程序,它允许用户以 root 或其他用户身份执行命令。它提供了一种有效的方式来授予某些用户适当的权限以使用特定的系统命令或以 root 用户身份运行脚本。使用 Linux 时一般使用普通用户 +sudo 权限而不是 root 用户,遵循最小权限原则,更安全。 sudo 使用默认的 sudoers 安全策略,并保留一个特殊的配置文件 /etc/sudoers。该文件可用于控制访问权限和密码提示超时。
然后添加中文支持:
修改 locale 文件配置:
这行命令的作用是用 Vim 编辑 /etc/default/locale 这个文件。 Linux 文件访问权限分为读取、写入和执行,普通用户在自己的用户目录(即家目录,路径为 /home/\<username>)下拥有读取和写入的权限,在其它目录只有读取的权限。这里我们用 sudo 提权,就可以写入这个文件了。
Vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
Vim 默认处于命令模式。按下 i,切换到插入模式,这样就可以编辑文件内容了。鼠标在这个界面只有滚动的功能,定位光标要用键盘上的方向键。将配置文件的内容修改为:
按下 Esc,返回命令模式。接着输入
:wq
,写入并退出配置文件。在 Vim 中,:w 是写入的命令,:q 是退出的命令,命令后加上 ! 表示强制执行。可以组合输入。
重启 Linux:
在 WSL 环境下,reboot 命令可能没什么用,需要手动关闭 Ubuntu 命令行窗口再重新打开。
现在,我们已经成功把 Linux 语言设置为中文了。
我们需要在 Linux 中安装以下环境:
- CUDA Tookit:NVIDIA 出的一个工具包,用于调用 CUDA 架构的强大算力。
- Conda:可以帮我们在一个系统里面创建多个 Python 运行环境,实现环境隔离和高效管理。
- PyTorch:著名的 Python 机器学习框架。
- Unsloth:著名的大模型训练工具。
CUDA Tookit
进入 CUDA Tookit 网站,点击中间的
Download Now
。按照图示选择:
选择完成后,下面会生成两行命令,在 Linux 上分别执行它们。形如:
请以网页上生成的命令为准。
wget 命令用于下载 URL 指向的文件到当前目录,最后打印“已保存”即为下载成功。 sh 是 bash 命令的缩写,用于执行脚本文件。 Bash(Bourne-Again SHell)是最常用的 Unix/Linux Shell 之一,并且是许多 Linux 发行版中的默认 Shell。 Shell 是指提供命令行界面以与操作系统交互的程序,用于接收用户的命令并显示输出。我们所说的命令行就是 Shell。当 Shell 以交互方式使用,在等待用户命令时会显示 Shell 提示符、当前目录和终端命令提示符。在本文的示例中,Shell 提示符是 zzzhizhi@ZhizhiPC。
如果打印了以上错误信息,请执行以下命令:
build-essentials 是编译软件所必需的元包。它们包括 GNU 调试器、g++/GNU 编译器集合以及编译程序所需的其他一些工具和库。例如,如果您需要使用 C/C++ 编译器,则需要在开始安装 C 编译器之前在系统上安装必要的元包。安装 build-essential 软件包时,系统上还会安装一些其他软件包,例如 G++、dpkg-dev、GCC 和 make 等。
然后会打印 EULA:
最终用户许可协议(End User Licence Agreement,EULA),指的是软件应用程序作者或者发布者与软件使用者所达成的协议,此协议一般在软件安装时出现。如果使用者拒绝接受 EULA,那么便不能安装此软件。用户被告知,当他们安装应用程序、执行下载文件或者简单地使用应用程序的时候就意味着他们已经接受了 EULA 中的条款。 EULA 主要规定用户不允许盗版软件。
按照提示,输入
accept
,按下 Enter。然后会打印 CUDA 安装配置页面:
使用方向键定位到
Install
,按下 Enter 即可。打印以下信息,说明安装成功:
Conda
在数据科学和机器学习领域,Anaconda 是一个非常受欢迎的 Conda 发行版,提供了许多常用的包和工具。它的适用语言涵盖了数据科学领域常见的 Python 库,并且自带了专门用来解决软件环境依赖问题的 Conda 包管理系统,主要提供包管理与环境管理的功能,可以很方便地解决多版本 Python 并存、切换以及各种第三方包安装问题。
接下来我们将详细介绍如何在 Linux 系统上安装和配置 Conda 环境,并展示如何高效地使用它。
下载 Conda
前往 Anaconda 官网,点击
Free Download
:点击
Skip registration
:复制最新版 Linux x86 64位安装包的链接:
回到 Linux 命令行,下载安装包:
请以复制的链接为准。
安装 Conda
执行以下命令:
然后会打印以下信息:
按照提示,按下 Enter。
之后会打印服务条款。按住空格往下滚动,直到打印:
输入
yes
,按下 Enter。然后是设置安装路径的界面:
按下 Enter 选择默认目录(用户目录下)。
等待 Conda 安装。然后会打印以下信息:
输入
no
,按下 Enter。恭喜,Conda 安装完成!
配置环境变量
执行
conda -V
查看版本,发现未找到命令:这是因为我们安装 Conda 时并不会自动配置环境变量,需要我们手动配置。
包含环境变量的配置文件是
.bashrc
,位于用户目录下。我们打开它:在文件的最后添加新的一行内容:
确保环境变量中的路径和 Conda 的安装路径一致。
最后,更新环境变量:
再次查看 Conda 版本,发现成功打印版本:
PyTorch
我们现在要用 Conda 创建一个 Python 环境。执行以下命令:
conda create 表示创建虚拟环境。-n 参数全称 --name,用来指定环境名称。llm 是环境名称。python 是环境的类型。3.11 是 Python 的版本。
等待片刻,询问是否继续进行:
我们直接按下 Enter 。
安装软件包、创建新环境时会经常出现 (y/n) 选择的情形。y 即 yes,n 即 no。此处 y 被单独括起来,表示默认选项,可以直接按下 Enter 默认。
打印以下内容即为成功创建:
我们需要执行 Conda 初始化:
更新环境变量:
然后会发现 Shell 提示符前出现了
(base)
,表示位于系统环境中:如果觉得难看,可以执行以下命令,禁用 base 环境的自动激活:
重启 Linux,发现
(base)
消失了。激活刚创建的
llm
环境:此时发现 Shell 提示符前出现了
(llm)
,表示处于 llm 虚拟环境中:执行命令安装 PyTorch:
打开 Python 解释器:
如果打印以下信息,说明 Python 环境安装正常:
在 Python 解释器中验证安装,如果所有 print 命令都能返回结果,则 PyTorch 安装正常:
最后退出 Python 解释器:
Unsloth
如今要微调大模型,从工具层面来看是很简单的。Unsloth 提供模型、代码,而且速度快、显存占用少,需要我们搞定的只是数据集和参数配置。
Unsloth 的安装是最简单的,执行以下命令:
在 Python 解释器中验证安装,没有报错则安装成功:
恭喜,现在你已经成功搭建了大模型微调环境!
配置推理环境
训练是通过从已有的数据中学习到某种能力;推理是简化并使用该能力,使其能快速、高效地对未知的数据进行操作,以获得预期的结果。我们已经解决了大模型在哪微调、用什么微调的问题,现在来解决怎么让模型和我们对话的问题。
我们通过这部分内容学习如何借助 Docker 部署 Ollama。
Docker
软件开发最大的麻烦事之一,就是环境配置。用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 软件,计算机必须有 Python 解释器,还必须有各种依赖,可能还要配置环境变量。如果缺失环境,或者某些模块与当前环境不兼容,那就麻烦了。开发者有句经典名言:“它在我的机器上运行得很好!”(It works on my machine)。
环境配置如此麻烦,能不能安装的时候就把原始环境一模一样地复制过来?虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在主机操作系统上运行另一个虚拟操作系统,直接把虚拟机文件发布给别人即可。但是它有资源占用多、冗余操作多、启动慢等缺点。
为了克服这些缺点,容器技术诞生了。容器不是模拟一个完整的操作系统,而是操作系统的用户层面,抛弃内核层面,在正常进程外面套了一个中间层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 APP)。更重要的是,容器性能开销极低。我们平常使用的软件几乎都可以看作容器。
Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache 2.0 协议开源,它是目前最流行的容器解决方案。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的镜像中,然后发布到任何流行操作系统的机器上,用容器运行,也可以实现虚拟化。Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版)和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
接下来我们安装 Docker。
安装依赖包,这些包允许 apt 使用 HTTPS 协议访问 Docker 仓库:
添加 Docker 官方 GPG 密钥:
添加 Docker 仓库:
安装 Docker:
验证安装:
Docker 官方下载源在国外,难以访问。我们要将下载源更换为国内镜像源。
编辑配置文件(可能是新文件),将文件内容替换为以下内容:
如果原本的文件内有其他内容,而你希望保留原本的内容只更改镜像源,那么需要注意去掉首尾的方括号,并在上一条记录的末尾加个逗号,以确保其符合 JSON 格式的规范,否则在你尝试重启 Docker 时必然会报错。以下是一个简单的示例:
更新配置文件,重启 Docker:
验证镜像源配置:
测试 Docker 是否能正常工作。执行以下命令,打印以下信息则说明成功:
Ollama
Ollama 是一个开源的大型语言模型服务工具,旨在帮助开发者和用户快速在本地运行大模型。通过简单的命令,用户可以高效地下载、创建、运行和管理各种开源 LLM。它提供了一个简洁易用的命令行界面和服务器,专为构建大型语言模型应用而设计。同时它还提供了一个丰富的预构建模型库,可以轻松集成到各种应用程序中。与传统 LLM 需要复杂配置和强大硬件不同,Ollama 能够让用户在消费级的 PC 上体验 LLM 的强大功能。Ollama 会自动监测本地计算资源,如有 GPU 的条件,会优先使用 GPU 的资源,同时模型的推理速度也更快。如果没有 GPU 条件,直接使用 CPU 资源。Ollama 极大地简化了在 Docker 容器中部署和管理大型语言模型的过程,使用户能够迅速在本地启动和运行这些模型。你可以打开 Ollama 官网,点击右上角的
Models
查看 Ollama 支持的模型。我们先拉取 Ollama 镜像:
这行命令的作用是将 Ollama 镜像从 Docker 镜像源拉取到本地。docker pull 是拉取镜像的命令,第一个 ollama 是镜像源名,第二个 ollama 是镜像名。
接下来我们部署 Ollama。
- NVIDIA GPU
安装 NVIDIA 容器工具包
配置 apt 源:
如果命令太长,在行尾输入反斜杠(\),即可换行输入。 对以上命令请全选复制和粘贴。
更新源:
安装工具包:
重启 Docker:
运行 Ollama:
在以上命令中,docker run 使用 ollama 镜像启动一个容器。 --gpus all 表示带 GPU 创建容器,在容器内调用主机的 CUDA。 -d 参数指定该容器在后台运行。 -v 参数用于挂载卷,将主机的 /opt/ai/ollama 目录挂载到容器内的 /root/.ollama 目录。这么做可以很方便地在主机环境中管理 Ollama 配置,达到便捷管理和持久化数据的目的。 -p 参数指定端口映射,第一个 11434 是主机端口,第二个 11434 是容器端口。 --name 参数指定容器名称,这里指定为 ollama。 ollama/ollama 是容器使用的镜像名称。
- AMD GPU
若要使用 Docker 在 AMD GPU 上运行 Ollama,请使用以下命令及标签:rocm
- CPU
在浏览器中访问 http://localhost:11434,如果页面上出现
Ollama is running
,则部署成功。部署本地大模型
开始前,我们先来了解一下模型的参数量和模型量化。
在人工智能(AI)的领域中,当我们提到“多少B”(例如 6B、34B)这样的术语时,它通常指的是模
型的参数量,其中“B”代表“Billion”,即“十亿”。因此,6B 表示模型有 60 亿个参数,而 34B 表示模型有 340 亿个参数。参数量更大的模型拥有更好的性能。
模型量化是将模型参数从高精度(通常是 float32)转换为低精度(如 int8 或更低)的过程。这种技术可以显著减少模型大小、降低计算复杂度,并加快推理速度,同时尽可能保持模型的性能。
接下来我们尝试运行 Gemma2:2b 大模型,使它和我们对话:
docker exec 命令用于在运行中的容器内执行一个新的命令。这对于调试、运行附加的进程或在容器内部进行管理操作非常有用。 -i 参数用于保持标准输入打开。 -t 参数用于分配一个伪终端,接受后续命令。 第一个 ollama 指定了在运行中的 ollama 容器中执行命令。 ollama run gemma2:2b 是运行模型的命令,如果模型在本地不存在会自动拉取。
此时你就可以和它对话了。恭喜你学会了部署本地大模型!
如果要退出 Ollama,可以使用 Ctrl+D 或
/bye
指令。大模型微调入门
我们向 Gemma2:2b 问一些关于《西游记》的问题:
呃,不能说不太理解吧,只能说完全不懂。通过这个回答,我对他们的关系更困惑了。
这时候就体现出微调的重要性了,接下来我们用 Lora 来微调模型。点击这个链接下载示例素材包。如果下载速度较慢,可以想办法加速 OneDrive。
准备训练样本
首先我们来准备训练样本。我们的目标是这样的,我想让模型说话像猴哥,甚至觉得它自己就是猴哥,同时也得让它对《西游记》了如指掌,人物关系、剧情发展啥的都清清楚楚。要达到这样的目标,训练样本就肯定要包含上面说的这些信息。我们怎么样才能有这样的训练样本呢?
我的办法是把《西游记》原始的小说文本提交给大模型,然后让大模型根据小说来生成训练样本。那选哪个大模型来干这个活比较好呢?肯定需要支持长文本,即能够消化大量的内容,和用户进行持续的交流。这里面涉及到的概念,就是“context window”,即人机对话时,大模型需要记住用户输入的文字或者文件内容,并给出相应的答复,简单来说,就是“记忆力”是不是够强。Kimi 目前支持 200 万 tokens 上下文,意味着它可以一口气吞下一整部《西游记》,然后吐出大量的训练样本,并且它还是免费的,于是我选用了它。
在 AI 领域,Token 是指模型处理的基本数据单位。它可以是单词、字符、短语甚至图像片段、声音片段等。例如,一句话会被分割成多个 Token,每个标点符号也会被视为单独的 Token。Token 的划分方式会影响模型对数据的理解和处理。例如,中英文的 Token 划分方式就存在差异。对于中文,由于存在多音字和词组的情况,Token 的划分需要更加细致。
以下是一些帮助理解 tokens 长度的经验法则:
- 1 token ~= 英文中的 4 个字符
- 1 token ~= ¾ 个单词
- 100 tokens ~= 75 个单词
- 1-2 个句子 ~= 30 tokens
- 1 段落 ~= 100 tokens
- 1,500 个单词 ~= 2048 tokens
为了获取更多关于 tokens 如何叠加的上下文,可以考虑以下例子:韦恩·格雷茨基的名言“You miss 100% of the shots you don't take”包含 11 个 tokens。
提示语这样设计:告诉大模型我们要提取的是关于孙悟空的信息,包含了他的背景、经历、关系等各个方面的信息,最后还是要求大模型以 JSON 格式输出训练样本。把《西游记》文本文件和提示语提交给它,然后就坐等结果。我的提示语设计如下:
生成的训练样本如下:
可以看到,生成的训练样本是很不错的。现在我们就可以用这些训练样本微调模型了。
微调初体验
我们将示例素材包移动到 Linux 的用户目录下。
在 Linux 中执行以下命令,解压示例素材包:
unzip 工具能够解压缩包含多个文件和目录的 .zip 压缩文件,并且广泛用于处理跨平台压缩文件。 .zip 压缩文件的编码方式不唯一,Windows 下生成的 .zip 压缩文件的编码是 GBK/GB2312 等,而 Linux 下的默认编码是 UTF-8,因此 Windows 下生成的 .zip 文件在 Linux 下解压时可能出现中文乱码问题。-O CP936 参数可以解决这个问题。
解压完成后,进入解压后的目录:
执行以下命令,启动训练:
如果看到这些内容,恭喜你,这意味着模型可以正常训练了!
训练完成后的模型保存在 model 目录下:
运行微调后的模型
.gguf 文件就是量化后的模型。量化模型可以直接给一些运行大模型的软件加载使用,比如 Ollama。为了让 Ollama 能识别这个模型,我们需要新建一个 Modelfile:
保存后,返回上级目录:
接下来,我们将 model 目录复制到 Ollama 挂载卷下:
cp 命令主要用于复制文件或目录。-r 参数,即 --recursive,用于递归复制目录及其所有的子目录和文件,如果要复制目录,需要使用该选项。
然后就可以创建本地模型:
Wukong 是模型名称,-f 参数指定 Modelfile 路径。注意这里是容器内的路径。
创建成功后可以执行下面命令验证 Ollama 中是否已有模型:
运行我们的猴哥模型:
最后,我们来看一下这位赛博猴哥的表现究竟如何:
可以看到这猴哥说话还真有那么几分神韵,有些问题回答得还挺在点上。相比于原生 Gemma2:2b 确实提升了不少。不过也容易发现这猴还是有点不太靠谱,比如问他一些宏观的问题,这猴就开始胡说八道了:
但是仔细一想,确实也不能怪他,我们给他的训练样本里压根就没这些内容,没学过的东西就只能瞎猜了呗。
恭喜,你已经学会了微调大模型!从现在开始,你只需要对
train.py
中的配置稍作修改,就可以在这个环境下开心地训练各种不同的模型。- 作者:DrimTech
- 链接:https://drim.cc/fine-turing-llm
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。