基于Chinese Tiny LLM - 2B 中文小模型的通用对话微调
现有大语言模型的训练大多以英语为核心,中文语料和能力往往处于次要地位,难以全面满足中文场景下的理解与生成需求。需要一个以中文为核心的大语言模型,能够在中文理解、生成和复杂任务处理上表现更优,同时兼顾一定的英文和编程能力。
CT-LLM 的核心特点在于,它并非一味追求超大规模参数,而是聚焦于自主构建和整理的高品质中文语料数据,在相对较小规模的大模型,提升中文核心能力。本实践在CT-LLM-Base模型上微调,使用 自定义 的COIG-CQIA(中文)
、OL-CC(中文)
和OpenHermesPreferences(英文)
数据集按不同数据配比进行指令微调,对比模型对话效果和模型评估结果,发现微调后的模型中文理解能力与生成核心能力显著提升。
前提条件
- 用户已经获取LLaMA Factory Online平台账户和密码,如果需要帮助或尚未注册,可参考注册账户完成注册。
- 当前账号的余额充裕,可满足模型微调服务的需要。点击可了解最新的活动及费用信息,或前往充值,如需了解更多请联系我们。
- 用户需要在JupyterLab中新建python环境并完成环境配置。操作方法参考数据处理中的步骤3。
操作步骤
配置概览
配置参数 | 配置项 | 是否预置 | 说明 |
---|---|---|---|
模型 | CT-LLM-Base | 是 | 参数量约20亿 (2B),擅长中文理解、生成和复杂任务处理。 |
数据集 | COIG-CQIA(中文) OL-CC(中文) OpenHermesPreferences(英文) | 是 | 高质量中文指令微调数据集 开源中文对话指令集 偏好排序数据集 |
GPU | H800*1(推荐) | - | - |
微调方法 | lora | - | 显著降低计算与存储成本,兼具高性能与部署灵活性。 |
资源消耗预览
- 模型微调时长
- 微调后模型Evaluate & Predict时长
- 原生模型Evaluate & Predict时长
操作详情
数据处理
-
进入LLaMA-Factory Online平台,点击页面左侧导航栏“实例空间”,点击开始微调按钮,进入[配置资源]页面,选择GPU资源,卡数填写1,点击“确认”,如下图所示。
由于数据处理后期需要使用Qwen模型计算困惑度,因此在这一步我们选择使用1张GPU卡。 -
点击右侧“JupyterLab处理专属数据”进入JupyterLab。新建两个文件夹“Chinesedata”和“data_ppl_filtered”,为后续数据处理做准备。两个文件夹路径分别为:
/workspace/Chinesedata
、/workspace/Chinesedata/data_ppl_filtered
。分别用于存储:完成困惑度计算的数据集、完成过滤和切分的数据集(训练集和测试集)。 -
创建并配置用于数据处理的python环境。 在 JupyterLab 中点击“Terminal”进入终端。
- 创建一个名为“ChineseTiny”的虚拟环境,python版本选择3.10。
conda create -n ChineseTiny python=3.10
- 激活环境。
conda activate ChineseTiny
- 安装依赖包。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ipykernel
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple accelerate
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple transformers torch tqdm datasets - 注册内核。
python -m ipykernel install --prefix=/usr/local --name ChineseTiny --display-name "python(ChineseTiny)"
提示上述注册内核的命令中,“--name”后的名字要严格和环境名称一致。
- 创建一个名为“ChineseTiny”的虚拟环境,python版本选择3.10。
-
进行数据处理。
-
下载数据处理脚本,点击脚本进行下载。
-
将该脚本拖到
/workspace
目录下,如下图高亮①所示。 -
双击打开脚本,切换内核为"python(ChinsesTiny)",如下图高亮②所示。
-
点击“运行按钮”逐行运行脚本,如下图高亮③所示。
-
在数据处理过程中,我们首先统一了各个数据集的格式,使其符合LLaMA-Factory的格式要求。具体要求可参考数据类型。并且计算了数据集的困惑度,将困惑度写入数据集中。
下面以各个数据集的第一个样本为例,展示原始数据和统一格式后的数据。
原始数据格式
- COIG-CQIA
- BAAI_OL-CC
- OpenHermesPreferences
{'instruction': '两个人连续投一枚硬币,如果先出现“正正反”则甲胜,如果先出现“正反反”则乙胜,两人获胜概率是否一样?假设硬币质地均匀,每次投硬币正反两面概率都是50%。连续投很多次,直到出现“正正反”或“正反反”为止。',
'input': '',
'output': '第一次如果投反,那么甲乙都等于推倒重练,两人获胜概率不会有任何变化。\n\n所以现在只需要考虑第一次投正的情况,假设此时甲胜率为 $$x$$ ,乙为 $$y$$ ,那么有两种概率各位1/2的情况:\n\n1 - 第二次投出正,这时甲将100%获胜,因为这一刻开始接下来除非不断投出正,只要一出现反甲就赢了。\n\n2 - 第二次投出反,这时看第三投,有1/2概率乙胜利(正反反),剩下1/2概率出现正反正,对于甲乙来说胜率相当于第一次投出正的情况,甲为 $$x$$,乙为 $$y$$。\n\n综合\n\n$$x=\\frac{1}{2}\\cdot1+\\frac{1}{2}\\left(\\frac{1}{2}\\cdot0+\\frac{1}{2}x\\right)$$ ,得出$$x=\\frac{2}{3}$$\n\n或者\n\n$$y=\\frac{1}{2}\\cdot0+\\frac{1}{2}\\left(\\frac{1}{2}\\cdot1+\\frac{1}{2}y\\right)$$ ,得出$$y=\\frac{1}{3}$$\n\n两者相加为1,验算通过。',
'task_type': {'major': ['问答'], 'minor': ['知乎问答']},
'domain': ['通用'],
'metadata': 'qid:584880907, aid:2904885349',
'answer_from': 'human',
'human_verified': True,
'copyright': '暂无版权及作者信息'}{'conversations': [{'from': 'human',
'value': '你好,我现在准备做一名小红书美妆博主,请问我该做些什么吗?可以给我一些详细的准备list'},
{'from': 'gpt',
'value': '当然! 以下是您可以采取的一些步骤来为您的小红书美妆博主之旅做准备:\n1.选择一个利基:确定你想要关注的特定美容领域。您对护肤、彩妆、护发或这些的组合感兴趣吗? 缩小你的利基将帮助你创建更有针对性的内容,你的观众会喜欢。\n2.研究您的受众: 通过浏览热门的小红书美妆账号了解您的潜在受众。观察他们参与最多的内容以及他们最感兴趣的主题。\n3.制定内容计划:针对您将创建的内容类型和频率制定计划。考虑哪种格式最适合您的利基市场,例如视频、照片或书面评论。提前计划您的帖子以保持一致的时间表。\n4.建立您的个人资料:创建代表您品牌的专业且具有视觉吸引力的个人资料。使用高质量的图像,并包含准确反映您的利基和个性的简历。\n5.发展合作伙伴关系: 在小红书上与其他美妆博主、品牌和影响者建立联系。与业内其他人建立关系有助于提高知名度和合作机会\n6.保持最新:了解美容行业的最新趋势和新闻。参加行业活动,阅读相关出版物,随时了解最新的产品和技术。\n7,与您的观众互动:通过回复评论和消息以及鼓励对您的帖子进行讨论来与您的关注者互动。这将有助于建立忠实的追随者并建立您在美容行业的权威。\n请记住在您的内容创作中保持真实、热情和一致。祝你的小红书美妆博主之旅顺利!'}]}{'source': 'airoboros2.2',
'category': 'orca',
'prompt': 'Every day, a tree drops 7 leaves. How many leaves would it drop in a month of February in a non-leap year? Include your logic.',
'candidates_completions': [" Here's the logic behind this:\n\n1. We know that February has 28 days in a normal, non-leap year.\n2. The tree drops 7 leaves every day.\n3. So, the number of leaves the tree drops in February would be the number of days in February times the number of leaves dropped each day:\n Leaves dropped in February = Days in February * Leaves per day\n = 28 days * 7 leaves/day\n = 196 leaves\n\nSo, the tree would drop 196 leaves in February in a non-leap year.",
"Here's the logic behind this:\n\n1. We know that February has 28 days in a non-leap year.\n2. If the tree drops 7 leaves every day, then over the course of February, it would drop:\n Leaves dropped in February = Leaves per day * Days in February\n = 7 leaves * 28 days\n = 196 leaves\n\nSo, the tree would drop 196 leaves in February in a non-leap year.",
"First, let's convert February in a non-leap year to the number of days for calculations. A non-leap year has 365 days, and February has 28 days in a non-leap year.\n\nNow, to find out how many leaves the tree drops in a month of February, we multiply the number of leaves dropped every day by the total number of days in February:\n\n7 leaves per day × 28 days in February = 196 leaves\n\nOn average, the tree drops 196 leaves in a month of February in a non-leap year."],
'candidate_policies': ['mistralai/Mixtral-8x7B-Instruct-v0.1',
'teknium/OpenHermes-2.5',
'NousResearch/Nous-Hermes-2-Yi-34B'],
'ranks': [1, 0, 2],
'rank_str': 'teknium/OpenHermes-2.5 > mistralai/Mixtral-8x7B-Instruct-v0.1 > NousResearch/Nous-Hermes-2-Yi-34B',
'chosen_policy': 'teknium/OpenHermes-2.5',
'chosen': [{'content': 'Every day, a tree drops 7 leaves. How many leaves would it drop in a month of February in a non-leap year? Include your logic.',
'role': 'user'},
{'content': "Here's the logic behind this:\n\n1. We know that February has 28 days in a non-leap year.\n2. If the tree drops 7 leaves every day, then over the course of February, it would drop:\n Leaves dropped in February = Leaves per day * Days in February\n = 7 leaves * 28 days\n = 196 leaves\n\nSo, the tree would drop 196 leaves in February in a non-leap year.",
'role': 'assistant'}],
'rejected_policy': 'NousResearch/Nous-Hermes-2-Yi-34B',
'rejected': [{'content': 'Every day, a tree drops 7 leaves. How many leaves would it drop in a month of February in a non-leap year? Include your logic.',
'role': 'user'},
{'content': "First, let's convert February in a non-leap year to the number of days for calculations. A non-leap year has 365 days, and February has 28 days in a non-leap year.\n\nNow, to find out how many leaves the tree drops in a month of February, we multiply the number of leaves dropped every day by the total number of days in February:\n\n7 leaves per day × 28 days in February = 196 leaves\n\nOn average, the tree drops 196 leaves in a month of February in a non-leap year.",
'role': 'assistant'}]}统一格式后的数据
- COIG-CQIA
- BAAI_OL-CC
- OpenHermesPreferences
{"id":8740,
"instruction":"如何判断一位女性朋友是否想谈恋爱",
"input":"",
"output":"朋友之间有时会发展成恋人,但是要确认女性朋友是否想要把友谊提升到一个新的层次并不容易。好在有一些迹象可以表明你的朋友对于恋爱关系是否感兴趣,比如注意她的肢体语言和你们之间的对话。\n\n## 注意她说的话\n\n**1. 注意她如何谈论她未来的计划。**当她谈论她的生活、事业或者未来时,是否把你包括在她的计划中。如果她这样做了,很有可能她想和你建立恋爱关系,并且未来的很长一段时间都会将你视为她生活的一部分。\n如果她没有这么做,也不用担心。她可能只是因为没有先和你谈过,所以不敢把你列入她的计划中。\n\n**2. 想想她是否会问你一些深奥的问题。**女人很擅长了解别人,因为她们知道该问什么问题。注意她是否问起你的职业规划、理想中未来的家庭、你的希望和梦想。这些都是她想看看你和她的未来是否相容的迹象。\n\n注意听像“你想要几个孩子?”、“你相信婚姻吗?”之类的问题。\n她可能还会问起你和家人的关系、以前的恋情或者你的信仰。\n\n**3. 你是否认为她对你敞开了心扉。**伴随着提问而来的是回答问题!如果她告诉了你她的信仰、过去的恋情和家庭,说明她可能很乐意和你在一起,并把你视为可以信任的人。虽然这对朋友来说也很正常,但这可能意味着她对发展更深层的关系持开放态度。\n尤其是如果她分享的故事对她来说非常有意义,甚至是痛苦的经历,更能印证这一点。如果她觉得可以自在地和你谈论让她情绪激动的话题,这是一个好迹象,表明她认为你是一个能给予她情感支持的人。\n\n**4. 注意她是否在你身边张口结舌或者很紧张。**有时候,你可以通过注意一个人说话的方式以及所说的话,判断她是否喜欢你。如果她看着你的时候语无伦次,或者显得很慌张,这是她喜欢你的一个很好的信号。\n如果她在讲一个尴尬的故事或者一个有趣的笑话,当她看你时可能会脸红,或者忘记自己在说什么。\n\n## 注意浪漫的举动\n\n**1. 注意她是否触摸你的手、头发或者手臂。**缠绵的抚摸是一个巨大的信号,表明一个女人对你感兴趣!如果她在你说话的时候伸出手来摸你的手、主动帮你梳头,或者用手轻轻抚摸你的手臂,说明她可能想和你发展恋情。\n\n如果你对被触摸感到不舒服,要让她知道这一点,并且告诉她你希望她停下来。好朋友会尊重你的界限。\n有些女人天生轻浮。试着注意她周围的人,看她是否也用同样的方式触摸他们。如果她这样做了,她可能只是一个轻浮的人!\n\n**2. 注意她是否想要照顾你。**当女性对某人感兴趣时,她们通常会不遗余力地帮助对方。如果她主动帮你做家务、送你一件小礼物,或者想为你做顿晚餐,可能是把你看作想要谈恋爱的对象。\n\n如果你也对她感兴趣,一定要感谢她,并且试着通过提供帮助来回报她的好意。\n如果你对她的浪漫举动不感兴趣,试着礼貌地拒绝她的提议,但要感谢她的好意。你可以这样说:“没关系,我想我自己可以处理,但是非常感谢你的帮助!”\n\n**3. 当她在你身边时,注意她是否在笑。**尽管她可能会在其他朋友面前大笑或者微笑,但要注意她是否一直都很开心,在你身边咯咯地笑。她可能会试图和你调情,或者让你知道你让她很开心!\n她甚至可能对你讲的不是特别好笑的笑话发笑。如果她在别人都不笑的时候笑了,这是她喜欢你的迹象。\n\n**4. 考虑一下她是否注意并且记住了你对她说的话。**虽然有些女人真的是很好的倾听者,但如果她对你感兴趣,她会加倍努力记下对你来说很重要的事情。当你们出去玩的时候,她可能会说:“哦,那件绿色的衬衫太漂亮了,是你最喜欢的颜色!”之类的话。\n如果她真的对你很认真,甚至会送你一件和你的兴趣爱好,或者你告诉她的故事有关的小礼物。\n\n**5. 等她把你介绍给她的家人。**对一个女人来说,向家人介绍自己的爱人是一个巨大的进步,因为这意味着她对自己和你的关系是认真的。如果她要求你见见她的家人,或者邀请你参加她家人可能也在的活动,她是在试图告诉你她认为你很特别,有见她家人们的资格!\n\n如果你还没有准备好开始一段认真的恋情,礼貌地拒绝她的邀请。你可以这样说:“我现在还没有准备好去见你的家人,但是我很高兴你能邀请我。”\n她可能会邀请你和他们一起吃饭,或者如果你们已经是很久的朋友了,你已经认识了她的父母,她可能会邀请你参加家庭活动。这也是一个很好的信号,表明她想要和你建立恋爱关系,所以你才能成为她参加活动或者晚餐时的“伴侣”。\n\n## 确定你的感情\n\n**1. 决定你是否想从你们的关系中得到同样的感情。**从一段友谊转变成恋爱关系,最重要的一步就是确定你是否想要同样的感情。问问自己你是否准备好投入到一段感情中了,你是否真的对她这个人感兴趣。尽量不要把自己置于将来可能会改变主意的境地。\n\n如果你打算约她出去,知道你想要什么样的关系也很重要。如果你想在正式交往前试着随意地约会一下,你可以这样说:“你愿意一起出去约会几次,看看会怎么样吗?”\n如果你只是对身体上的亲密关系感兴趣,那就对她诚实一些。有些女孩可以接受“炮友”关系,有的则绝对不行。\n\n**2. 如果你真的想谈恋爱,那就约她吧。**如果她用不同的方式表达了她对你的兴趣,那么邀请她约会是很安全的做法。记得要尊重她,诚实地表达你的意图,告诉她你对她的感觉。\n\n你可以这样说:“我觉得你人很好,我对你感兴趣已经有一段时间了。你愿意和我出去约会吗?”\n如果她说愿意,准备好在约会时给对方留下一个好印象。\n如果她说不愿意,不要沮丧或者气馁。你们仍然可以做朋友,你可以试着以后约你感兴趣的其他人出去约会。\n\n**3. 如果你不想谈恋爱,就跟她说实话。**在某些情况下,你可能对你的朋友不感兴趣。如果你注意到她可能对你感兴趣,最好的做法是告诉她你只是把她当作朋友。\n\n为了做到最好,你可以这样说:“我注意到你最近对我的态度有所不同,我想现在就解决这个问题。我真的很珍惜我们的友谊,我对友谊之外的关系不感兴趣。我希望你能明白我的意思。”\n她可能会难过一段时间,但只要你对她好一点,让她知道你还是想让她出现在在你的生活中,一切都会好起来的。\n\n**小贴士**\n\n- 有时候,调情和友善很容易被混淆。如果你注意到当你和她调情时她变得不自在,那么她可能只是把你当朋友一样友善地对待你。\n- 想要确认她是否对你有感觉,一个很好的方法是,一旦你注意到她对你感兴趣,就和她谈一谈。",
"subset":"wikihow",
"perplexity":8.8612393807},{"id":4279,
"instruction":"可以说一下甲流的症状、治疗以及如何预防么?",
"input":"",
"output":"甲型流感(H1N1流感)是一种由病毒引起的传染病,最初于2009年在墨西哥爆发,随后在全世界多地蔓延。以下是关于甲流的症状、治疗和预防的信息:\n症状:\n甲流的症状类似于普通感冒,包括发热、喉咙痛、咳嗽、流涕、全身疼痛、乏力等。某些患者还可能出现恶心、呕吐、腹泻等不适症状。对于某些高危人群,如老年人、儿童、孕妇和患有慢性病的人,甲流可能导致严重并发症,如肺炎和呼吸系统衰竭。\n治疗:\n甲流的治疗通常包括症状缓解和支持疗法,如体外换气、氧疗、液体管理和预防感染等。一些患者可能需要药物治疗,如抗病毒药物(例如奥司他韦)和抗生素,但这些药物应在医生的建议下使用。\n预防:\n预防甲流的最佳方法是接种疫苗。此外,个人应保持良好的卫生习惯,如勤洗手、避免与患者密切接触、避免接触眼鼻口和嘴等,以帮助减少病毒传播。人们还应该尽可能避免前往高危地区和参加拥挤的社交活动等。对于感染甲流的人来说,最好呆在家里休息,避免传播病毒给他人。",
"perplexity":4.135931862},{"id":3982,
"instruction":"What is the maximum value of the Z component for the Rössler system with parameters a=0.2, b=0.2 and c=5.7 when simulated for a time span of 100 seconds with a time step of 0.01?",
"input":"",
"output":" The Rössler system is a system of three non-linear differential equations that describes chaotic behavior. The equations are as follows:\n\ndx\/dt = -y - z\ndy\/dt = x + a*y\ndz\/dt = b + z*(x - c)\n\nwhere a, b, and c are parameters.\n\nTo find the maximum value of the Z component for the Rössler system with parameters a=0.2, b=0.2 and c=5.7 when simulated for a time span of 100 seconds with a time step of 0.01, we need to solve the differential equations numerically using a method such as Euler's method or a more sophisticated method like Runge-Kutta.\n\nUsing Python and the `scipy.integrate` library with the `odeint` function, which implements a variable-coefficient quasi-constant stepsize multistep Adams-Bashforth-Moulton method (an Adams method), we can simulate the Rössler system and find the maximum value of the Z component as follows:\n```python\nimport numpy as np\nfrom scipy.integrate import odeint\n\n# Define the Rössler system\ndef rossler(x, t, a=0.2, b=0.2, c=5.7):\n xdot = np.zeros((3,))\n xdot[0] = -x[1] - x[2]\n xdot[1] = x[0] + a*x[1]\n xdot[2] = b + x[2]*(x[0] - c)\n return xdot\n\n# Set the time span and time step\nt0 = 0.0\ntf = 100.0\ndt = 0.01\nt = np.arange(t0, tf, dt)\n\n# Set the initial condition\nx0 = np.array([0.1, 0.1, 0.1])\n\n# Solve the Rössler system\nx = odeint(rossler, x0, t, args=(0.2, 0.2, 5.7))\nz = x[:, 2]\n\n# Find the maximum value of the Z component\nmax_z = np.max(z)\nprint(f\"The maximum value of the Z component is {max_z:.4f}\")\n```\nThe output of this code is:\n```yaml\nThe maximum value of the Z component is 41.5805\n```\nTherefore, the maximum value of the Z component for the Rössler system with parameters a=0.2, b=0.2 and c=5.7 when simulated for a time span of 100 seconds with a time step of 0.01 is approximately 41.5805. Note that the exact value may depend on the numerical method and the time step used for the simulation.",
"perplexity":1.6777256012} -
困惑度 是自然语言处理领域常用的语言模型评估指标。它用于衡量模型对文本的预测能力,数值越低表示模型对数据的拟合越好,生成的文本越自然。计算困惑度后,我们检查各个数据集困惑度的分布情况,过滤掉了困惑度高于前75%的数据样本。
- COIG-CQIA
- BAAI_OL-CC
- OpenHermesPreferences
[
{'percent': 5, 'ppl': 1.7610674731193086},
{'percent': 10, 'ppl': 2.3774340539787198},
{'percent': 25, 'ppl': 4.183896373821549},
{'percent': 50, 'ppl': 8.10350818504899},
{'percent': 75, 'ppl': 13.909937685844394},
{'percent': 90, 'ppl': 22.34595027351144},
{'percent': 95, 'ppl': 28.69867577413068}
][
{'percent': 5, 'ppl': 2.2512770989338713},
{'percent': 10, 'ppl': 2.761334751785927},
{'percent': 25, 'ppl': 4.112294234512126},
{'percent': 50, 'ppl': 7.2186414117500455},
{'percent': 75, 'ppl': 15.189722120515711},
{'percent': 90, 'ppl': 31.907068451192295},
{'percent': 95, 'ppl': 53.16710477206508}
][
{'percent': 5, 'ppl': 1.2475027827005578},
{'percent': 10, 'ppl': 1.3065404603656507},
{'percent': 25, 'ppl': 1.4655815537205998},
{'percent': 50, 'ppl': 1.7440874003968343},
{'percent': 75, 'ppl': 2.341236651281213},
{'percent': 90, 'ppl': 3.7357444091526344},
{'percent': 95, 'ppl': 5.3147955360710295}
]提示本实践提供了处理自定义数据集,并将数据用于模型训练的教程,您也可以点击下载,直接获得处理完毕的数据集,快速开始微调训练。
-
-
数据集检测。 将完成处理的数据(路径为:
/workspace/Chinesedata/data_ppl_filtered
)复制到user-data目录下(路径为/workspace/user-data/datasets
)。回到LlamaFactory Online页面,进入文件管理页面,在数据集Tab下找到复制的数据集,在操作处点击“数据集检测”,“数据集格式检测”的状态变为“符合”,数据集可以用于微调训练。
-
数据配比。 我们后续的训练将基于三种中英数据配比方式的数据集进行,因此需要对数据集进行切割。本实践通过编辑
llamafactory/data/dataset_info.json
文件内的“num_samples”字段来实现对数据集提取样本数量的控制。-
三种中英数据配比方式说明
实验1 实验2 实验3 中英语料比例 1:0 2:1 4:1 中文语料采样数 6000条OL-CC数据样本,1000条COIG-CQIA数据样本 英文语料采样数 0 3500条OpenHermesPreferences数据样本 1750条OpenHermesPreferences数据样本 -
切割数据集。 进入
llamafactory/data
目录,打开该目录下的“dataset_info.json”文件,找到上一步数据检测后写入的数据目录,在对应数据目录中写入“num_samples”字段。如下图所示。
按照上面“三种中英数据配比方式说明”,我们设置:
"coig_caia_train_ppl_filtered"采样1000条(如下图高亮①所示);
"olcc_train_ppl_filtered"采样6000条(如下图高亮②所示);
"open_hermes_train_ppl_filtered_1"采样3500条(如下图高亮③所示);
"open_hermes_train_ppl_filtered_2"采样1750条(如下图高亮④所示)。
-
模型训练
-
点击“控制台”,进入控制台后点击左侧导航栏的“实例空间”进入页面,如下图所示。
-
单击上图“开始微调”按钮,进入[配置资源]页面,选择GPU资源,卡数填写
1
,点击“确认”,如下图所示。 -
单击左侧“LLaMA-Factory快速微调模型”按钮,进入LLaMA Factory Online在线WebUI微调配置页面,语言选择
zh
,如下图高亮①所示;模型名称处可以选择任意模型,建议选择不常用的模型以区分保存目录,如下图高亮②所示;模型路径严格填入/shared-only/models/m-a-p/CT-LLM-Base
,如下图高亮③所示。提示由于LlamaFactory官方暂不支持
CT-LLM-Base
模型,故虽然平台已内置该模型,但模型名称处不显示该模型的名称。只需要严格按下图高亮③的路径输入,模型名称处可以不设置,训练时默认使用CT-LLM-Base
模型。 -
微调方法选择
lora
,如下图高亮④所示;选择“train”功能项,训练方式保持Supervised Fine-Tuning
,如下图高亮⑤所示;数据路径保持/workspace/llamafactory/data
,如下图高亮⑥所示;数据集处根据不同的实验数据配比,选择用户自定义的数据集,如下图高亮⑦所示。参数设置建议与下图橙色框中一致。提示按照三种中英数据配比方式,在模型微调训练中,三个实验的数据集选择方式如下:
- 实验一: "coig_caia_train_ppl_filtered"、"olcc_train_ppl_filtered"。
- 实验二: "coig_caia_train_ppl_filtered"、"olcc_train_ppl_filtered"、"open_hermes_train_ppl_filtered_1"。
- 实验三: "coig_caia_train_ppl_filtered"、"olcc_train_ppl_filtered"、"open_hermes_train_ppl_filtered_2"。
- 实验一
- 实验二
- 实验三
-
(可选)其余参数可根据实际需求调整,具体说明可参考参数说明,本实践中的其他参数均保持默认值。
-
参数配置完成后,点击“开始”按钮启动微调任务。页面底部将实时显示微调过程中的日志信息,如下图高亮①所示;同时展示当前微调进度及Loss变化曲线,如下图高亮②所示。微调完成后,系统提示“训练完毕”,例如下图高亮③所示。
- 实验一
- 实验二
- 实验三
提示因为实验较多,注意区分不同实验的输出目录,后续在模型对话和模型微调时,需要在检查点路径处使用该目录。
- 微调后模型对话
- 原生模型对话
-
切换至“chat”界面,选择各个实验训练完成的检查点路径,如下图高亮①所示;单击“加载模型”按钮,如下图高亮②所示;微调的模型加载后,在对话框处填入问题,如下图高亮③所示;点击提交(高亮④);在对话框中观察模型回答(高亮⑤)。
- 实验一
- 实验二
- 实验三
提示完成上一个实验微调后的模型对话,要使用其他实验微调后的模型时,要先卸载模型,再更换检查点路径。
-
单击下图高亮①所示的“卸载模型”按钮,卸载微调后的模型;清空“检查点路径”中的LoRA配置,如下图高亮②所示;单击“加载模型”按钮(高亮③),加载原生的
Qwen-3-8B
模型进行对话,其余配置保持不变。用户在高亮④处输入提问,观察模型回答(高亮⑥)。
观察各实验微调后的模型与原生模型的对话结果,发现:微调后的模型对话更准确,全面。其中实验二微调后的模型对话效果最佳,结构清晰,具有条理性。
- 微调后模型评估
- 原生模型评估
-
切换至“Evaluate & Predict”,选择各实验微调后模型的检查点路径,例如下图高亮⑤所示;然后选择用户自定义的测试集
coig_cqia_test_ppl_filtered
、olcc_test_ppl_filtered
、open_hermes_test_ppl_filtered
,并根据实际需求配置评估参数(本实践的参数设置如下图橙色框所示)。- 实验一
- 实验二
- 实验三
-
参数配置完成后,点击“开始”按钮即可启动评估,页面底部将实时显示评估过程中的日志信息,评估完成后,记录评估结果,结果如下所示。
- 实验一
- 实验二
- 实验三
{
"predict_bleu-4": 26.10712983333333,
"predict_model_preparation_time": 0.0033,
"predict_rouge-1": 42.860893,
"predict_rouge-2": 31.289016833333335,
"predict_rouge-l": 38.055303333333335,
"predict_runtime": 377.9389,
"predict_samples_per_second": 1.588,
"predict_steps_per_second": 0.064
}结果解读:微调后模型BLEU-4为:26.11,说明生成文本与参考答案的短语重合度较高,模型生成能力明显提升。ROUGE-1(42.86)、ROUGE-2(31.29)、ROUGE-L(38.06)显示模型在词汇覆盖、短语匹配和句法连贯性方面表现良好。
{
"predict_bleu-4": 30.438529499999998,
"predict_model_preparation_time": 0.0032,
"predict_rouge-1": 44.21832966666666,
"predict_rouge-2": 31.905345166666667,
"predict_rouge-l": 39.036376000000004,
"predict_runtime": 377.3795,
"predict_samples_per_second": 1.59,
"predict_steps_per_second": 0.064
}结果解读:微调后模型BLEU-4为:30.44,说明短语重合度最高,生成内容与标准答案最接近,模型效果最佳。ROUGE-1(44.22)、ROUGE-2(31.91)、ROUGE-L(39.04),各项指标均为最高,语义覆盖和连贯性最优。 推理速度与实验一相近,效率良好
{
"predict_bleu-4": 26.129219166666665,
"predict_model_preparation_time": 0.0033,
"predict_rouge-1": 41.89300333333334,
"predict_rouge-2": 31.156517166666667,
"predict_rouge-l": 38.269154666666665,
"predict_runtime": 408.2223,
"predict_samples_per_second": 1.47,
"predict_steps_per_second": 0.059
}结果解读:微调后模型BLEU-4为:26.13,与实验一接近,生成质量明显优于基模型。ROUGE-1(41.89)、ROUGE-2(31.16)、ROUGE-L(38.27),各项指标略低于实验一、二,但仍远超基模型。
-
切换至“Evaluate & Predict”页面,清空检查点路径配置,数据集依旧选择用户自定义的
coig_cqia_test_ppl_filtered
、olcc_test_ppl_filtered
、open_hermes_test_ppl_filtered
测试集,并根据实际需求配置评估参数(本实践的参数设置如下图所示)。 -
完成配置后,点击“开始”按钮即可启动评估,页面底部将实时显示评估过程中的日志信息,评估完成后,记录评估结果,结果如下所示。
{
"predict_bleu-4": 11.3354095,
"predict_model_preparation_time": 0.0033,
"predict_rouge-1": 27.187581,
"predict_rouge-2": 17.412995333333335,
"predict_rouge-l": 16.031221,
"predict_runtime": 400.2423,
"predict_samples_per_second": 1.499,
"predict_steps_per_second": 0.06
}结果解读:原生模型评估结果各项指标较低,BLEU-4为:11.34,说明生成文本与参考答案重合度较低,生成能力有限。ROUGE-1(27.19)、ROUGE-2(17.41)、ROUGE-L(16.03),语义覆盖、短语匹配和句法连贯性均较差。。
对比各实验微调后的模型评估与原生模型评估结果可以看出,微调后的模型(实验一、二、三)在生成质量和文本相似度方面均远超基模型,实验二效果最佳。
总结
ChineseTiny-LLM主要聚焦于自主整理的高品质数据,在相对较小规模的大模型,提升中文核心能力。本案例初步展示了微调数据的处理,收集了多个开源数据集,并对其进行格式统一、品质过滤、配比设置等,全流程模拟目前的主流开源中文模型。
同时,本实践将处理完的数据按三种不同的配比方式,放在CT-LLM-Base模型上,使用LLAmaFactory Online平台的任务模式和实例模式进行微调,对比模型微调前后的对话效果和评估结果,微调后模型在中文理解与生成上的能力显著提升。