prompt课后作业 #192

Open
opened 2024-10-15 14:16:32 +08:00 by 12390900721cs · 0 comments

【基础】申请国内线上大模型的apikey并进行调用

这里我选择调用的是百度千帆的ERNIE-Speed-Pro-128K模型。

百度千帆大模型

申请API

在应用接入中创建应用,选择对应的模型并创建应用获得API。

查看使用文档

写调用文件

阅读文档后,按格式改写模型输入:

import os
import qianfan

# 替换下列示例中参数,将应用API_Key、应用Secret key值替换为真实值
os.environ["QIANFAN_AK"] = "Your API_Key"
os.environ["QIANFAN_SK"] = "Your Secret Key"

chat_comp = qianfan.ChatCompletion()

# 提示词
prompt = """You are a powerful text-to-SQL model. Your job is to answer questions about a database. You are given a question and context regarding one or more tables.

You must output the SQL query that answers the question.
### Input:
Which Class has a Frequency MHz larger than 91.5, and a City of license of hyannis, nebraska?

### Context:
CREATE TABLE table_name_12 (class VARCHAR, frequency_mhz VARCHAR, city_of_license VARCHAR)

### Response:
"""

# 指定特定模型
resp = chat_comp.do(model="ERNIE-Speed-128K", messages=[{
    "role": "user",
    "content": prompt
}])

print(resp["body"])

模型调用

由于调用文件导入了外部库,所以我们要先进行安装:

pip install qianfan

安装完成后对调用文件进行编译:

python call_ernie.py

结果如下,可以看到成功进行了APIKey的调用并输出了正确结果。

【进阶】使用中文数据微调code-llama,并测试效果

数据准备

本次微调使用的数据集:Chinese_SQL_Content

使用如下命令将数据下载到/code/dataset/datasets/sql_datasets2目录下:

huggingface-cli download jtjt520j/CSpider_sql_create_context --repo-type dataset --revision main --local-dir-use-symlinks False --local-dir /code/dataset/datasets/sql_datasets2

这里我本来想下载到dataset/datasets/sql_datasets2的,但是这个目录我不晓得为什么不能编辑。

算法准备

准备好数据集后,我们要在对应的训练算法(llama2_7b_chat_qlora_sql_e3_copy.py)中将数据集的路径也做对应修改。

模型微调

实验使用二机8卡进行,确定一台主机的IP作为master节点,这里我的主节点IP为10.244.174.187。

确定主节点后,分别使用如下命令进行微调:

# NODE 0:
NPROC_PER_NODE=4 NNODES=2 PORT=12345 ADDR=10.244.174.187 NODE_RANK=0 xtuner train llama2_7b_chat_qlora_sql_e3_copy.py --work-dir /code/xtuner-homeworkdir/ --deepspeed deepspeed_zero3_offload

# NODE 1:
NPROC_PER_NODE=4 NNODES=2 PORT=12345 ADDR=10.244.174.187  NODE_RANK=1 xtuner train llama2_7b_chat_qlora_sql_e3_copy.py --work-dir /code/xtuner-homeworkdir --deepspeed deepspeed_zero3_offload

注意:这里的--work-dir参数选择了训练检查点存储的位置:

--work-dir /code/xtuner-homeworkdir 

NODE 1:

NODE 2:

训练ing...

训练完成。

训练后获得的模型:xtuner-homeworkdir/iter_271.pth

模型测试

模型转换

  • 模型转换lora->hf,将lora训练的checkpoint转成hf格式的模型。
  • 在前面提到过,我将训练的检查点存储在--work-dir /code/xtuner-homeworkdir 位置,故需要将该位置下存储的iter_271.pth转化为hf格式的模型。这里我选择将转换后的模型存储在/code/iter_271_hf_homework/位置。
  • 注意⚠️ 这里的模型位置/code/xtuner-homeworkdir/iter_271.pth是我训练好放在这里的,如果是自己训练的模型,并修改了work-dir,需要填写对应的路径。
xtuner convert pth_to_hf /code/llama2_7b_chat_qlora_sql_e3_copy.py /code/xtuner-homeworkdir/iter_271.pth/ /code/iter_271_hf_homework/

可以看到在/code目录下出现了/iter_271_hf_homework目录。

测试文件准备

对在final_test.py文件中的prompt做对应修改:

对微调后模型的位置做对应修改:

模型测试

python final_test.py

测试1:

可以看到微调前后的模型都给出了正确答案,可能是问题太简单了,再换一个难一点的看看。

测试2:

test文件:

测试效果:

微调前:

CREATE TABLE employee (name VARCHAR, salary VARCHAR, department_id VARCHAR), CREATE TABLE department (num_employees VARCHAR, name VARCHAR, department_id VARCHAR)

微调后:

SELECT name , num_employees FROM department JOIN management ON department.department_id = management.department_id WHERE management.temporary_acting = "是"

正确答案:SELECT T1.name , T1.num_employees FROM department AS T1 JOIN management AS T2 ON T1.department_id = T2.department_id WHERE T2.temporary_acting = '是'

可以看到,很明显,训练后的模型得到的答案更接近正确答案(但是还是有点不一样,那个T1、T2我不知道是干嘛的,除了这个都差不多),而且会说中文了,证明我们使用中文数据集的微调是有效的。

# <font style="color:#333333;">【基础】申请国内线上大模型的apikey并进行调用</font> 这里我选择调用的是百度千帆的[**<font style="color:rgb(34, 34, 34);">ERNIE-Speed-Pro-128K</font>**](https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Bm0hnziyn)模型。 [<font style="color:#117CEE;">百度千帆大模型</font>](https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Nlks5zkzu) ## <font style="color:#333333;">申请API</font> 在应用接入中创建应用,选择对应的模型并创建应用获得API。 ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728716985974-984a428f-79e2-4535-81ab-bbe1a5b70d75.png) #### ## 查看使用文档 ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728717317824-d560770a-c881-40ea-97e6-c3ebc76e6fd1.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728717338564-2985b273-9c59-466a-ae44-0a3691b6f8d4.png) ## 写调用文件 阅读文档后,按格式改写模型输入: ```plain import os import qianfan # 替换下列示例中参数,将应用API_Key、应用Secret key值替换为真实值 os.environ["QIANFAN_AK"] = "Your API_Key" os.environ["QIANFAN_SK"] = "Your Secret Key" chat_comp = qianfan.ChatCompletion() # 提示词 prompt = """You are a powerful text-to-SQL model. Your job is to answer questions about a database. You are given a question and context regarding one or more tables. You must output the SQL query that answers the question. ### Input: Which Class has a Frequency MHz larger than 91.5, and a City of license of hyannis, nebraska? ### Context: CREATE TABLE table_name_12 (class VARCHAR, frequency_mhz VARCHAR, city_of_license VARCHAR) ### Response: """ # 指定特定模型 resp = chat_comp.do(model="ERNIE-Speed-128K", messages=[{ "role": "user", "content": prompt }]) print(resp["body"]) ``` ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728717489413-2a40c9ff-e0ce-4c5b-8e5a-68519aeab7b7.png) ## 模型调用 由于调用文件导入了外部库,所以我们要先进行安装: ```plain pip install qianfan ``` ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728717626403-37f014c9-70e7-44a2-af41-6729ee6efcb4.png) 安装完成后对调用文件进行编译: ```plain python call_ernie.py ``` 结果如下,可以看到成功进行了APIKey的调用并输出了正确结果。 ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728717825921-dacf897f-83a0-4755-ad34-c81b71c5d3e5.png) # <font style="color:#333333;">【进阶】使用中文数据微调code-llama,并测试效果</font> ## 数据准备 本次微调使用的数据集:[Chinese_SQL_Content](https://huggingface.co/datasets/jtjt520j/CSpider_sql_create_context/viewer) ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728718378798-40a882ff-1b47-4e05-9cee-af8b8a9b11c0.png) 使用如下命令将数据下载到/code/dataset/datasets/sql_datasets2目录下: huggingface-cli download jtjt520j/CSpider_sql_create_context --repo-type dataset --revision main --local-dir-use-symlinks False --local-dir /code/dataset/datasets/sql_datasets2 <font style="color:#DF2A3F;">这里我本来想下载到dataset/datasets/sql_datasets2的,但是这个目录我不晓得为什么不能编辑。</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728718566341-56b213b3-5cf8-4bb5-8279-9d2a0a1b24ef.png)![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728718576868-7b630c32-b342-4766-815f-e41d07293568.png) ## 算法准备 准备好数据集后,我们要在对应的训练算法(llama2_7b_chat_qlora_sql_e3_copy.py)中将数据集的路径也做对应修改。 ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728718851369-cdaf02fb-0c82-44bd-a1e5-39263744c97a.png) ## 模型微调 实验使用二机8卡进行,确定一台主机的IP作为master节点,这里我的主节点IP为10.244.174.187。 确定主节点后,分别使用如下命令进行微调: ```plain # NODE 0: NPROC_PER_NODE=4 NNODES=2 PORT=12345 ADDR=10.244.174.187 NODE_RANK=0 xtuner train llama2_7b_chat_qlora_sql_e3_copy.py --work-dir /code/xtuner-homeworkdir/ --deepspeed deepspeed_zero3_offload # NODE 1: NPROC_PER_NODE=4 NNODES=2 PORT=12345 ADDR=10.244.174.187 NODE_RANK=1 xtuner train llama2_7b_chat_qlora_sql_e3_copy.py --work-dir /code/xtuner-homeworkdir --deepspeed deepspeed_zero3_offload ``` ### 注意:这里的--work-dir参数选择了训练检查点存储的位置: ```plain --work-dir /code/xtuner-homeworkdir ``` NODE 1: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728719226113-fd4bbea0-76c8-40d3-a13a-91b6089e6eb0.png) NODE 2: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728719240934-fca3f351-55dd-4b98-bdd3-f81ef2fbe400.png) 训练ing... ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728719447389-995c7f33-01a9-452d-a89a-1b34983f4ab7.png) 训练完成。 ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728721404297-2a2270a6-91b2-4a95-9b70-5283a43fb420.png) 训练后获得的模型:xtuner-homeworkdir/iter_271.pth ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728721889151-50af1c02-6027-4d18-acf6-0a6dbae663cd.png) ## 模型测试 ### 模型转换 + <font style="color:#333333;">模型转换lora->hf,将lora训练的checkpoint转成hf格式的模型。</font> + <font style="color:#333333;">在前面提到过,我将训练的检查点存储在--work-dir /code/xtuner-homeworkdir 位置,故需要将该位置下存储的iter_271.pth转化为hf格式的模型。这里我选择将转换后的模型存储在/code/iter_271_hf_homework/位置。</font> + <font style="color:#333333;">注意</font><font style="color:#333333;">⚠️</font><font style="color:#333333;"> 这里的模型位置/code/xtuner-homeworkdir/iter_271.pth是我训练好放在这里的,如果是自己训练的模型,并修改了work-dir,需要填写对应的路径。</font> ```plain xtuner convert pth_to_hf /code/llama2_7b_chat_qlora_sql_e3_copy.py /code/xtuner-homeworkdir/iter_271.pth/ /code/iter_271_hf_homework/ ``` ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728722295186-4394e3a2-43fa-4edb-9136-0d284d24debd.png) 可以看到在/code目录下出现了/iter_271_hf_homework目录。 ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728722346411-3fc205d4-3543-4e03-b7e9-8ee18b9dd49c.png) ### <font style="color:#000000;">测试文件准备</font> 对在final_test.py文件中的prompt做对应修改: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728720565507-74d5c7bc-449e-482d-81cf-aa08fcc17342.png) 对微调后模型的位置做对应修改: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728722403891-9e982ff3-6753-4ee4-b45f-39da8e1150ae.png) ### 模型测试 ```plain python final_test.py ``` #### 测试1: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728722617333-5f339ded-481c-4c40-846d-1900e91dc590.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728722518450-ea084ba8-3a9c-4b4d-be21-f9037e544896.png) 可以看到微调前后的模型都给出了正确答案,可能是问题太简单了,再换一个难一点的看看。 #### 测试2: test文件: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728722691528-b1f22eea-8b72-48f1-9d0a-22b3f7cb2e1c.png) 测试效果: 微调前: CREATE TABLE employee (name VARCHAR, salary VARCHAR, department_id VARCHAR), CREATE TABLE department (num_employees VARCHAR, name VARCHAR, department_id VARCHAR) 微调后: SELECT name , num_employees FROM department JOIN management ON department.department_id = management.department_id WHERE management.temporary_acting = "是" ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728722859278-dd06dbbd-8ff8-4a2c-9e72-d7e971d34157.png) 正确答案:SELECT T1.name , T1.num_employees FROM department AS T1 JOIN management AS T2 ON T1.department_id = T2.department_id WHERE T2.temporary_acting = '是' ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728722735236-a286138c-0e92-401d-a9c3-04ebeb9abe93.png) 可以看到,很明显,训练后的模型得到的答案更接近正确答案(但是还是有点不一样,那个T1、T2我不知道是干嘛的,除了这个都差不多),而且会说中文了,证明我们使用中文数据集的微调是有效的。
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: HswOAuth/llm_course#192
No description provided.