基于LLAMA-7B的lora中文指令微调

news/2024/12/4 21:29:43/

目录

  • 1. 选用工程
  • 2. 中文llama-7b预训练模型下载
  • 3. 数据准备
  • 4. 开始指令微调
  • 5. 模型测试

前言:

  • 系统:ubuntu18.04
  • 显卡:GTX3090 - 24G (惨呀,上次还是A100,现在只有3090了~)
    (本文旨在快速实现基于llama-7b的中文指令微调)

1. 选用工程

咱们还是用lit-llama(环境安装过程见上篇博客)

  • 地址:https://github.com/Lightning-AI/lit-llama在这里插入图片描述

2. 中文llama-7b预训练模型下载

  • 模型下载
    在huggingface上搜索"llama chinese",我们选以下这个模型,如图所示:在这里插入图片描述

  • 模型转换
    切换到lit-llama的工程,修改scripts/convert_hf_checkpoint.py,修改路径,

    • checkpoint_dir:从huggingface下载的权重路径
    • output_dir:转换之后保存的路径
      如下图所示:在这里插入图片描述
  • 切换到lit-llama项目路径下,运行如下指令,进行模型转换:

    python scripts/convert_hf_checkpoint.py
    
  • 转换完毕后,在刚才设置的输出路径,会得到lit-llama.pth文件(26G),在上一级目录有tokenizer.model文件
    在这里插入图片描述

3. 数据准备

  • 这里我们选用alpaca的中文指令数据alpaca_data_zh_51k.json,下载地址如下所示:在这里插入图片描述
  • 打开文件,指令数据如下所示:在这里插入图片描述
  • 切换到lit-llama项目路径,打开scripts/prepare_alpaca.py(这里建议复制一份),主要修改如下图所示:
    1)修改中文指令数据文件名
    2)修改中文指令数据存放路径
    3)修改中文llama模型的tokenizer.model路径
    4)中文llama-7b的max_seq_length设置为2048,但是如果你只有一张3090显卡,设置2048会显存溢出,所以这里我们只设置256
    5)因为已经下载完alpaca_data_zh_51k.json文件了,注释掉36和38行代码
    在这里插入图片描述
  • 切换到lit-llama项目路径,运行如下指令:
    python scripts/prepare_alpaca.py	
    
  • 运行完毕之后,会在刚才设置的destination_path下得到train.pt和test.pt的数据文件,如下图所示:在这里插入图片描述
    到这里,数据准备完成。

4. 开始指令微调

  • 修改vocab_size
    由于原始llama-7b指令的vocab_size为32000,而下载的中文llama-7b的词典大小为49953,需要对其进行修改。打开lit-llama/model.py,将padded_vocab_size设置为49953,如下图所示:
    在这里插入图片描述

  • 打开finetune/lora.py(建议复制一份),修改训练脚本指令路径,包括:
    1)data_dir:中文指令文件路径
    2)pretrained_path:转换之后的中文lit-llama.pth路径
    3)tokenizer_path:中文llama-7b的tokenizer.model路径
    4)out_dir:保存lora权重文件的路径
    在这里插入图片描述

  • 切换到lit-llama项目路径,运行以下指令开始指令微调:

    python finetune/lora.py
    
  • 训练过程如下所示:在这里插入图片描述

5. 模型测试

  • 切换到lit-llama项目路径,打开generate/lora.py(建议复制一份),修改对应的权重路径和tokenizer.model路径,如下图所示:在这里插入图片描述

  • 我们设置prompt为"中国的首都是哪里?",运行如下指令进行测试:

    python generate/lora-chinese.py --prompt "中国的首都是哪里?"
    
  • 测试结果如下所示:在这里插入图片描述

总结:

  • 注意替换vocab_size,原始llama-7b的词典大小为32000,下载的中文预训练模型vocab_size为49953
  • 原工程中max_seq_length设置为256,下载的中文预训练模型max_seq_length为2048,但是由于受显存限制(穷~),做中文指令微调时也设置为max_seq_length=256,可能会影响效果。
  • 下一步工作尝试使用多卡训练以及使用自己的数据进行指令微调

结束。


http://www.ppmy.cn/news/699105.html

相关文章

获取Android设备唯一标识码

概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码。虽然Android系统中提供了这样设备识别码,但是由于Android系统版本、厂商定制系统中的Bug等限制,稳定性和唯一性并不理想。而通过其他硬件信息标识也因为系统…

如何确定Android设备唯一识别码

本文为转载文章,原文链接。如有侵权,联系后删除。 应用设备唯一识别码的解决方案 设备唯一识别码.png 唯一标识必须满足两个特性才能完美解决定位唯一设备的问题,但这个问题的解决却注定只能极限接近完美 唯一性:标识必须在所有使用该应用的…

Android 唯一识别码

本文转载自:http://blog.csdn.net/billpig/article/details/6728573 我们在项目过程中或多或少会使用到设备的唯一识别码,我们希望能够得到一个稳定、可靠的设备唯一识别码。今天我们将介绍几种方式。 1. DEVICE_ID 假设我们确实需要用到真实设备的标识…

Android 获取手机的 IMEI 值 (设备标识码)

权限 <uses-permission android:name"android.permission.READ_PHONE_STATE"/> private void setPhoneStateManifest(){if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) ! PackageManager.PERMISSION_GRANTED) {// toas…

手机码的识别

*#06# IMEI 码&#xff0c;也就是我们所说的手机串号&#xff0c;几乎所以手机都适用&#xff0c; IMEI 就是“国际移动装备辨识码”&#xff0c; IMEI TACFACSNRSP&#xff0c;其中TAC是批准型号码&#xff0c;共6位&#xff0c;FAC是最后组装地代码&#xff0c;共2位&#xf…

手机识别码

简介 IMEI IMEI&#xff08;International Mobile Equipment Identity&#xff09;&#xff0c;国际移动设备身份码缩写&#xff0c;国际移动装备辨识码&#xff0c;15位数。它与每台移动电话机一一对应且全世界唯一。每移动电话机组装后都被赋予一全球唯一号码&#xff0c;该…

关于手机唯一识别码的研究meid和imei

本来想获取手机唯一识别码时候&#xff0c;突然发现电信的识别码和其他制式的识别码是不同的。 IMSI国际移动用户识别码(IMSI International Mobile Subscriber Identification Number)国际上为唯一识别一个移动用户所分配的号码,是区别移动用户的标志&#xff0c;储存在SIM卡中…

Android 获取手机系统版本号、获取手机型号、获取手机厂商、获取手机IMEI、获取手机CPU_ABI、获取手机唯一识别码

1.先申请权限&#xff0c;关于如何申请权限请查看RxPermissions的使用&#xff08;简单实用&#xff09;_ErwinNakajima的博客-CSDN博客 2.手機唯一識別碼管理類。 package com.phone.common_library.manager;import android.Manifest; import android.content.Context; impo…