当前位置:   article > 正文

04 XTuner 大模型单卡低成本微调实战

04 XTuner 大模型单卡低成本微调实战

        在上一期内容中介绍了RAG的大模型定制方案以及具体实现的demo,这一期将对finetune进行简单介绍。


目录

1 Finetune简介

1.1 监督微调

1.2 增量预训练

1.3 LoRA & QLoRA

2 XTuner微调框架

3 微调实战

3.1 公开数据集demo

3.2 自定义微调


1 Finetune简介

        LLM的下游应用中,增量预训练和指令跟随是经常会用到的两种微调模式。两者的区别在于增量预训练往往是让基座模型学习到一些新知识,例如某个垂类领域的常识,训练数据往往是无监督的文章、书籍、代码等自然语言。而指令跟随以及监督微调主要目的是让模型学会对话模板,根据人类指令进行对话。在实际应用中,仅通过此阶段也能注入一定量的垂类知识。其训练数据集是有标签的监督高质量的对话和问答数据。与增量预训练不太一样的一点在于,此阶段对数据的质量要求较高,而对数据集的大小没有过多要求。

1.1 监督微调

        在实际对话时,通常会有三种角色 System给定一些上下文信息,比如“你是个安全的 A 助手”实际用户, User 会提出一些问题,比如“世界第一高峰是?” 根据 User 的输入,Assistant结合 System 的上下文信息,做出答,比如“珠穆朗玛峰”。需要注意的是,不同的开源大模型的模板不一样,尤其是special token的设置方面。在训练时需要严格匹配。

1.2 增量预训练

        此阶段使用的是无监督的语料数据,在处理上往往将system和input字段留空而只使用assistant字段进行训练。为了让 LLM 知道什么时候开始一段话,什么时候结束一段话实际训练时需要对数据添加起始符 (BOS) 和结束符(EOS)大多数的模型都是使用<s> 作为起始符,</s> 作为结束符。

1.3 LoRA & QLoRA

        LoRA由论文 Lora: Low-rank adaptation of large language models 提出,QLoRA在LoRA的基础上主要增加了大模型的量化技术,由论文 Qlora: Efficient finetuning of quantized llms 提出:

        简单来说,LoRA是通过在原本的模型权重之外增加一个支路,这个支路包含两个小的部分A,B,这个新增的旁路成为Adapter。Aghajanyan的研究表明:预训练模型拥有极小的内在维度(instrisic dimension),即存在一个极低维度的参数,微调它和在全参数空间中微调能起到相同的效果。同时Aghajanyan发现在预训练后,越大的模型有越小的内在维度,这也解释了为何大模型都拥有很好的few-shot能力。

        全参数微调、LoRA微调、QLoRA对比如图:

        QLORA包含两个组件:4-bit NormalFloat量化和Double Quantization。其中:4-bit NormalFloat数据类型是基于Quantile Quantization技术开发的,通过估计输入张量的分位数来保证每个量化区间分配相等的值。Double Quantization是将额外的量化常数进行量化以减小内存开销的过程。论文的另外一个贡献是合页优化器 (Paged Optimizer) 即gpu显存满了可以将一部分参数移到cpu内存里面计算 (Offload) ,进一步降低了显存开销。


2 XTuner微调框架

        XTuner适配多种生态,可以从HuggingFace、ModelScope等库加载模型和数据集,同时支持多款开源大模型;InternLM、Llama、Qwen、Baichuan、ChatGLM、Mistral (MoE) 等等。具体内容可以参考具体的github页面。目前支持的内置配置:

  1. baichuan2_13b_base_qlora_alpaca_e3
  2. baichuan2_13b_base_qlora_alpaca_enzh_e3
  3. baichuan2_13b_base_qlora_alpaca_enzh_oasst1_e3
  4. baichuan2_13b_base_qlora_alpaca_zh_e3
  5. baichuan2_13b_base_qlora_arxiv_gentitle_e3
  6. baichuan2_13b_base_qlora_code_alpaca_e3
  7. baichuan2_13b_base_qlora_colorist_e5
  8. baichuan2_13b_base_qlora_lawyer_e3
  9. baichuan2_13b_base_qlora_oasst1_512_e3
  10. baichuan2_13b_base_qlora_oasst1_e3
  11. baichuan2_13b_base_qlora_open_platypus_e3
  12. baichuan2_13b_base_qlora_sql_e3
  13. baichuan2_13b_chat_qlora_alpaca_e3
  14. baichuan2_13b_chat_qlora_alpaca_enzh_e3
  15. baichuan2_13b_chat_qlora_alpaca_enzh_oasst1_e3
  16. baichuan2_13b_chat_qlora_alpaca_zh_e3
  17. baichuan2_13b_chat_qlora_code_alpaca_e3
  18. baichuan2_13b_chat_qlora_lawyer_e3
  19. baichuan2_13b_chat_qlora_oasst1_512_e3
  20. baichuan2_13b_chat_qlora_oasst1_e3
  21. baichuan2_13b_chat_qlora_open_platypus_e3
  22. baichuan2_7b_base_qlora_alpaca_e3
  23. baichuan2_7b_base_qlora_alpaca_enzh_e3
  24. baichuan2_7b_base_qlora_alpaca_enzh_oasst1_e3
  25. baichuan2_7b_base_qlora_alpaca_zh_e3
  26. baichuan2_7b_base_qlora_arxiv_gentitle_e3
  27. baichuan2_7b_base_qlora_code_alpaca_e3
  28. baichuan2_7b_base_qlora_colorist_e5
  29. baichuan2_7b_base_qlora_lawyer_e3
  30. baichuan2_7b_base_qlora_oasst1_512_e3
  31. baichuan2_7b_base_qlora_oasst1_e3
  32. baichuan2_7b_base_qlora_open_platypus_e3
  33. baichuan2_7b_base_qlora_sql_e3
  34. baichuan2_7b_chat_qlora_alpaca_e3
  35. baichuan2_7b_chat_qlora_alpaca_enzh_e3
  36. baichuan2_7b_chat_qlora_alpaca_enzh_oasst1_e3
  37. baichuan2_7b_chat_qlora_alpaca_zh_e3
  38. baichuan2_7b_chat_qlora_code_alpaca_e3
  39. baichuan2_7b_chat_qlora_lawyer_e3
  40. baichuan2_7b_chat_qlora_oasst1_512_e3
  41. baichuan2_7b_chat_qlora_oasst1_e3
  42. baichuan2_7b_chat_qlora_open_platypus_e3
  43. baichuan_13b_base_qlora_alpaca_e3
  44. baichuan_13b_base_qlora_alpaca_enzh_e3
  45. baichuan_13b_base_qlora_alpaca_enzh_oasst1_e3
  46. baichuan_13b_base_qlora_alpaca_zh_e3
  47. baichuan_13b_base_qlora_arxiv_gentitle_e3
  48. baichuan_13b_base_qlora_code_alpaca_e3
  49. baichuan_13b_base_qlora_colorist_e5
  50. baichuan_13b_base_qlora_lawyer_e3
  51. baichuan_13b_base_qlora_medical_e1
  52. baichuan_13b_base_qlora_moss_sft_all_e1
  53. baichuan_13b_base_qlora_moss_sft_all_e2_gpu8
  54. baichuan_13b_base_qlora_moss_sft_plugins_e1
  55. baichuan_13b_base_qlora_oasst1_512_e3
  56. baichuan_13b_base_qlora_oasst1_e3
  57. baichuan_13b_base_qlora_open_platypus_e3
  58. baichuan_13b_base_qlora_openorca_e1
  59. baichuan_13b_base_qlora_sql_e3
  60. baichuan_13b_base_qlora_tiny_codes_e1
  61. baichuan_13b_chat_qlora_alpaca_e3
  62. baichuan_13b_chat_qlora_alpaca_enzh_e3
  63. baichuan_13b_chat_qlora_alpaca_enzh_oasst1_e3
  64. baichuan_13b_chat_qlora_alpaca_zh_e3
  65. baichuan_13b_chat_qlora_arxiv_gentitle_e3
  66. baichuan_13b_chat_qlora_code_alpaca_e3
  67. baichuan_13b_chat_qlora_colorist_e5
  68. baichuan_13b_chat_qlora_lawyer_e3
  69. baichuan_13b_chat_qlora_medical_e1
  70. baichuan_13b_chat_qlora_oasst1_512_e3
  71. baichuan_13b_chat_qlora_oasst1_e3
  72. baichuan_13b_chat_qlora_open_platypus_e3
  73. baichuan_13b_chat_qlora_openorca_e1
  74. baichuan_13b_chat_qlora_sql_e3
  75. baichuan_13b_chat_qlora_tiny_codes_e1
  76. baichuan_7b_qlora_alpaca_e3
  77. baichuan_7b_qlora_alpaca_enzh_e3
  78. baichuan_7b_qlora_alpaca_enzh_oasst1_e3
  79. baichuan_7b_qlora_alpaca_zh_e3
  80. baichuan_7b_qlora_arxiv_gentitle_e3
  81. baichuan_7b_qlora_code_alpaca_e3
  82. baichuan_7b_qlora_colorist_e5
  83. baichuan_7b_qlora_lawyer_e3
  84. baichuan_7b_qlora_medical_e1
  85. baichuan_7b_qlora_moss_sft_all_e1
  86. baichuan_7b_qlora_moss_sft_all_e2_gpu8
  87. baichuan_7b_qlora_moss_sft_plugins_e1
  88. baichuan_7b_qlora_oasst1_512_e3
  89. baichuan_7b_qlora_oasst1_e3
  90. baichuan_7b_qlora_open_platypus_e3
  91. baichuan_7b_qlora_openorca_e1
  92. baichuan_7b_qlora_sql_e3
  93. baichuan_7b_qlora_tiny_codes_e1
  94. chatglm2_6b_qlora_alpaca_e3
  95. chatglm2_6b_qlora_alpaca_enzh_e3
  96. chatglm2_6b_qlora_alpaca_enzh_oasst1_e3
  97. chatglm2_6b_qlora_alpaca_zh_e3
  98. chatglm2_6b_qlora_arxiv_gentitle_e3
  99. chatglm2_6b_qlora_code_alpaca_e3
  100. chatglm2_6b_qlora_colorist_e5
  101. chatglm2_6b_qlora_lawyer_e3
  102. chatglm2_6b_qlora_medical_e1
  103. chatglm2_6b_qlora_oasst1_512_e3
  104. chatglm2_6b_qlora_oasst1_e3
  105. chatglm2_6b_qlora_open_platypus_e3
  106. chatglm2_6b_qlora_openorca_e1
  107. chatglm2_6b_qlora_sql_e3
  108. chatglm2_6b_qlora_tiny_codes_e1
  109. chatglm3_6b_base_qlora_alpaca_e3
  110. chatglm3_6b_base_qlora_alpaca_enzh_e3
  111. chatglm3_6b_base_qlora_alpaca_enzh_oasst1_e3
  112. chatglm3_6b_base_qlora_alpaca_zh_e3
  113. chatglm3_6b_base_qlora_arxiv_gentitle_e3
  114. chatglm3_6b_base_qlora_code_alpaca_e3
  115. chatglm3_6b_base_qlora_colorist_e5
  116. chatglm3_6b_base_qlora_lawyer_e3
  117. chatglm3_6b_base_qlora_medical_e1
  118. chatglm3_6b_base_qlora_oasst1_512_e3
  119. chatglm3_6b_base_qlora_oasst1_e3
  120. chatglm3_6b_base_qlora_open_platypus_e3
  121. chatglm3_6b_base_qlora_openorca_e1
  122. chatglm3_6b_base_qlora_sql_e3
  123. chatglm3_6b_base_qlora_tiny_codes_e1
  124. chatglm3_6b_qlora_alpaca_e3
  125. chatglm3_6b_qlora_alpaca_enzh_e3
  126. chatglm3_6b_qlora_alpaca_enzh_oasst1_e3
  127. chatglm3_6b_qlora_alpaca_zh_e3
  128. chatglm3_6b_qlora_arxiv_gentitle_e3
  129. chatglm3_6b_qlora_code_alpaca_e3
  130. chatglm3_6b_qlora_colorist_e5
  131. chatglm3_6b_qlora_lawyer_e3
  132. chatglm3_6b_qlora_medical_e1
  133. chatglm3_6b_qlora_oasst1_512_e3
  134. chatglm3_6b_qlora_oasst1_e3
  135. chatglm3_6b_qlora_open_platypus_e3
  136. chatglm3_6b_qlora_openorca_e1
  137. chatglm3_6b_qlora_sql_e3
  138. chatglm3_6b_qlora_tiny_codes_e1
  139. deepspeed_zero1
  140. deepspeed_zero2
  141. deepspeed_zero2_offload
  142. deepspeed_zero3
  143. deepspeed_zero3_offload
  144. internlm_20b_qlora_alpaca_e3
  145. internlm_20b_qlora_alpaca_enzh_e3
  146. internlm_20b_qlora_alpaca_enzh_oasst1_e3
  147. internlm_20b_qlora_alpaca_zh_e3
  148. internlm_20b_qlora_arxiv_gentitle_e3
  149. internlm_20b_qlora_code_alpaca_e3
  150. internlm_20b_qlora_colorist_e5
  151. internlm_20b_qlora_lawyer_e3
  152. internlm_20b_qlora_msagent_react_e3_gpu8
  153. internlm_20b_qlora_oasst1_512_e3
  154. internlm_20b_qlora_oasst1_e3
  155. internlm_20b_qlora_open_platypus_e3
  156. internlm_20b_qlora_sql_e3
  157. internlm_7b_full_alpaca_e3
  158. internlm_7b_full_alpaca_enzh_e3
  159. internlm_7b_full_alpaca_enzh_oasst1_e3
  160. internlm_7b_full_alpaca_zh_e3
  161. internlm_7b_full_oasst1_e3
  162. internlm_7b_qlora_alpaca_e3
  163. internlm_7b_qlora_alpaca_enzh_e3
  164. internlm_7b_qlora_alpaca_enzh_oasst1_e3
  165. internlm_7b_qlora_alpaca_zh_e3
  166. internlm_7b_qlora_arxiv_gentitle_e3
  167. internlm_7b_qlora_code_alpaca_e3
  168. internlm_7b_qlora_colorist_e5
  169. internlm_7b_qlora_lawyer_e3
  170. internlm_7b_qlora_medical_e1
  171. internlm_7b_qlora_moss_sft_all_e1
  172. internlm_7b_qlora_moss_sft_all_e2_gpu8
  173. internlm_7b_qlora_moss_sft_plugins_e1
  174. internlm_7b_qlora_msagent_react_e3_gpu8
  175. internlm_7b_qlora_oasst1_512_e3
  176. internlm_7b_qlora_oasst1_e3
  177. internlm_7b_qlora_oasst1_e3_hf
  178. internlm_7b_qlora_oasst1_mmlu_e3
  179. internlm_7b_qlora_open_platypus_e3
  180. internlm_7b_qlora_openorca_e1
  181. internlm_7b_qlora_sql_e3
  182. internlm_7b_qlora_tiny_codes_e1
  183. internlm_chat_20b_qlora_alpaca_e3
  184. internlm_chat_20b_qlora_alpaca_enzh_e3
  185. internlm_chat_20b_qlora_alpaca_enzh_oasst1_e3
  186. internlm_chat_20b_qlora_alpaca_zh_e3
  187. internlm_chat_20b_qlora_code_alpaca_e3
  188. internlm_chat_20b_qlora_lawyer_e3
  189. internlm_chat_20b_qlora_oasst1_512_e3
  190. internlm_chat_20b_qlora_oasst1_e3
  191. internlm_chat_20b_qlora_open_platypus_e3
  192. internlm_chat_7b_qlora_alpaca_e3
  193. internlm_chat_7b_qlora_alpaca_enzh_e3
  194. internlm_chat_7b_qlora_alpaca_enzh_oasst1_e3
  195. internlm_chat_7b_qlora_alpaca_zh_e3
  196. internlm_chat_7b_qlora_arxiv_gentitle_e3
  197. internlm_chat_7b_qlora_code_alpaca_e3
  198. internlm_chat_7b_qlora_colorist_e5
  199. internlm_chat_7b_qlora_lawyer_e3
  200. internlm_chat_7b_qlora_medical_e1
  201. internlm_chat_7b_qlora_oasst1_512_e3
  202. internlm_chat_7b_qlora_oasst1_e3
  203. internlm_chat_7b_qlora_open_platypus_e3
  204. internlm_chat_7b_qlora_openorca_e1
  205. internlm_chat_7b_qlora_sql_e3
  206. internlm_chat_7b_qlora_tiny_codes_e1
  207. llama2_70b_int8_lora_open_platypus_e1
  208. llama2_70b_int8_lora_open_platypus_e1_hf
  209. llama2_70b_qlora_open_platypus_e1
  210. llama2_70b_qlora_open_platypus_e1_hf
  211. llama2_7b_chat_qlora_alpaca_e3
  212. llama2_7b_chat_qlora_alpaca_enzh_e3
  213. llama2_7b_chat_qlora_alpaca_enzh_oasst1_e3
  214. llama2_7b_chat_qlora_alpaca_zh_e3
  215. llama2_7b_chat_qlora_arxiv_gentitle_e3
  216. llama2_7b_chat_qlora_code_alpaca_e3
  217. llama2_7b_chat_qlora_colorist_e5
  218. llama2_7b_chat_qlora_lawyer_e3
  219. llama2_7b_chat_qlora_medical_e1
  220. llama2_7b_chat_qlora_oasst1_512_e3
  221. llama2_7b_chat_qlora_oasst1_e3
  222. llama2_7b_chat_qlora_open_platypus_e3
  223. llama2_7b_chat_qlora_openorca_e1
  224. llama2_7b_chat_qlora_sql_e3
  225. llama2_7b_chat_qlora_tiny_codes_e1
  226. llama2_7b_full_wizardlm_e1
  227. llama2_7b_qlora_alpaca_e3
  228. llama2_7b_qlora_alpaca_enzh_e3
  229. llama2_7b_qlora_alpaca_enzh_oasst1_e3
  230. llama2_7b_qlora_alpaca_zh_e3
  231. llama2_7b_qlora_arxiv_gentitle_e3
  232. llama2_7b_qlora_code_alpaca_e3
  233. llama2_7b_qlora_colorist_e5
  234. llama2_7b_qlora_lawyer_e3
  235. llama2_7b_qlora_medical_e1
  236. llama2_7b_qlora_moss_sft_all_e1
  237. llama2_7b_qlora_moss_sft_all_e2_gpu8
  238. llama2_7b_qlora_moss_sft_plugins_e1
  239. llama2_7b_qlora_msagent_react_e3_gpu8
  240. llama2_7b_qlora_oasst1_512_e3
  241. llama2_7b_qlora_oasst1_e3
  242. llama2_7b_qlora_open_platypus_e3
  243. llama2_7b_qlora_openorca_e1
  244. llama2_7b_qlora_sql_e3
  245. llama2_7b_qlora_tiny_codes_e1
  246. llama_7b_qlora_alpaca_e3
  247. llama_7b_qlora_alpaca_enzh_e3
  248. llama_7b_qlora_alpaca_enzh_oasst1_e3
  249. llama_7b_qlora_alpaca_zh_e3
  250. llama_7b_qlora_arxiv_gentitle_e3
  251. llama_7b_qlora_code_alpaca_e3
  252. llama_7b_qlora_colorist_e5
  253. llama_7b_qlora_lawyer_e3
  254. llama_7b_qlora_medical_e1
  255. llama_7b_qlora_moss_sft_all_e1
  256. llama_7b_qlora_moss_sft_all_e2_gpu8
  257. llama_7b_qlora_moss_sft_plugins_e1
  258. llama_7b_qlora_oasst1_512_e3
  259. llama_7b_qlora_oasst1_e3
  260. llama_7b_qlora_open_platypus_e3
  261. llama_7b_qlora_openorca_e1
  262. llama_7b_qlora_sql_e3
  263. llama_7b_qlora_tiny_codes_e1
  264. mistral_7b_qlora_skypile_pretrain_e1
  265. qwen_7b_chat_qlora_alpaca_e3
  266. qwen_7b_chat_qlora_alpaca_enzh_e3
  267. qwen_7b_chat_qlora_alpaca_enzh_oasst1_e3
  268. qwen_7b_chat_qlora_alpaca_zh_e3
  269. qwen_7b_chat_qlora_arxiv_gentitle_e3
  270. qwen_7b_chat_qlora_code_alpaca_e3
  271. qwen_7b_chat_qlora_colorist_e5
  272. qwen_7b_chat_qlora_lawyer_e3
  273. qwen_7b_chat_qlora_medical_e1
  274. qwen_7b_chat_qlora_oasst1_512_e3
  275. qwen_7b_chat_qlora_oasst1_e3
  276. qwen_7b_chat_qlora_open_platypus_e3
  277. qwen_7b_chat_qlora_openorca_e1
  278. qwen_7b_chat_qlora_sql_e3
  279. qwen_7b_chat_qlora_tiny_codes_e1
  280. qwen_7b_qlora_alpaca_e3
  281. qwen_7b_qlora_alpaca_enzh_e3
  282. qwen_7b_qlora_alpaca_enzh_oasst1_e3
  283. qwen_7b_qlora_alpaca_zh_e3
  284. qwen_7b_qlora_arxiv_gentitle_e3
  285. qwen_7b_qlora_code_alpaca_e3
  286. qwen_7b_qlora_colorist_e5
  287. qwen_7b_qlora_lawyer_e3
  288. qwen_7b_qlora_medical_e1
  289. qwen_7b_qlora_moss_sft_all_e1
  290. qwen_7b_qlora_moss_sft_all_e2_gpu8
  291. qwen_7b_qlora_moss_sft_plugins_e1
  292. qwen_7b_qlora_oasst1_512_e3
  293. qwen_7b_qlora_oasst1_e3
  294. qwen_7b_qlora_open_platypus_e3
  295. qwen_7b_qlora_openorca_e1
  296. qwen_7b_qlora_sql_e3
  297. qwen_7b_qlora_tiny_codes_e1
  298. starcoder_qlora_stack_exchange_example
  299. yi_34b_qlora_alpaca_enzh_e3
  300. yi_6b_qlora_alpaca_enzh_e3
  301. zephyr_7b_beta_qlora_alpaca_e3

        XTuner默认开启了Flash Attention的加速方式。Flash Attention和DeepSpeed ZeRO是XTuner最重要的两个优化技巧。Flash Attention 将 Attention 计算并行化避免了计算过程中 Attention Score NxN的显存占用 (训练过程中的 N 都比较大)。ZeRO 优化通过将训练过程中的参数、梯度和优化器状态切片保存,能够在多 GPU 训练时显著节省显存除了将训练中间状态切片外,DeepSpeed 训练时使用FP16 的权重,相较于 Pytorch 的AMP 训练在单 GPU 上也能大幅节省显存。


3 微调实战

3.1 公开数据集

        XTuner框架自动开启Flash Attention,利用1/4张A100显卡利用 QLoRA 算法在 oasst1 数据集上微调 InternLM-7B一个epoch大约需要4个小时,开始DeepSpeed后大约需要2个小时。将转换成HuggingFace格式的Adapter和原模型合并后,进行对话,结果如图:

        由于是全精度,模型的推理速度和加载速度均比较慢。在生成回答时是“一个字一个字蹦”。加上 --bits 4 参数让模型在4bit精度上加载可以加快这个速度,并且在一些简单问题上,模型的输出结果并不会有很大的差别:

        且模型具备多轮对话能力。

3.2 自定义微调

        以Medication QA数据集为例,数据集的格式是.xlsx格式的。再次步骤只需要更改私域数据集的格式以满足训练要求即可。同时在代码中将模型文件夹路径和数据集路径正确配置即可。由于数据集较小只需要2min左右的时间:

        另外一个任务要求通过微调修改模型的自我认知:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/577146
推荐阅读
相关标签
  

闽ICP备14008679号