闯关地图-基础岛
基础岛
第1关
任务:观看本关卡视频(未上传制作中)后,写一篇关于书生大模型全链路开源开放体系的笔记发布到知乎、CSDN等任一社交媒体,将作业链接提交到以下问卷,助教老师批改后将获得 100 算力点奖励!!!
第2关
基础任务
任务:使用 Cli Demo 完成 InternLM2-Chat-1.8B 模型的部署,并生成 300 字小故事,记录复现过程并截图。
使用transformer
库函数实现模型问答,并生成300字小故事,Python程序如下:
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
model_dir = '/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b'
tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_dir, torch_dtype=torch.float16, trust_remote_code=True).cuda()
model = model.eval()
# Initialize conversation history
history = []
def ask_by_query(model, query,
history=[]):
response = None
length = 0
for response, history in model.stream_chat(tokenizer,
query,
history=history):
print(response[length:], end='', flush=True)
length = len(response)
print('')
return history
print("开始对话,输入'exit'退出对话")
history = []
while True:
# 获取用户输入
inp = input("[INPUT] ")
if inp.lower() == 'exit':
print("结束对话。")
break
# 生成响应
print("[OUTPUT] ", end='')
history = ask_by_query(model, inp, history)
效果图如下:
进阶任务
-
使用 LMDeploy 完成 InternLM-XComposer2-VL-1.8B 的部署,并完成一次图文理解对话,记录复现过程并截图。(优秀学员必做)
-
使用 LMDeploy 完成 InternVL2-2B 的部署,并完成一次图文理解对话,记录复现过程并截图。(优秀学员必做)
-
使用Streamlit部署
InternLM2-Chat-1.8B
模型命令行执行:
streamlit run Tutorial/tools/streamlit_demo.py --server.address 127.0.0.1 --server.port 6660
即可在本地端口号6660
执行在线的Demo运行如下命令设置端口映射:
ssh -p {ssh端口} root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:8501 -o StrictHostKeyChecking=no
将远程开发机的8501端口映射到本机的7860端口
设置端口映射后,使用浏览器访问
http://127.0.0.1:6660
,效果图如下: -
使用LMDeploy部署
InternLM-XComposer2-VL-1.8B
模型安装环境依赖:
conda activate lmdeploy pip install lmdeploy[all]==0.5.1 pip install timm==1.0.7
执行命令:
lmdeploy serve gradio /share/new_models/Shanghai_AI_Laboratory/internlm-xcomposer2-vl-1_8b --cache-max-entry-count 0.1
效果图如下:
-
使用LMDeploy部署
InternVL2-2B
模型执行命令(在上一步的基础上):
lmdeploy serve gradio /share/new_models/OpenGVLab/InternVL2-2B --cache-max-entry-count 0.1
效果图如下:
第3关
基础任务
- 背景问题:近期相关研究发现,LLM在对比浮点数字时表现不佳,经验证,internlm2-chat-1.8b (internlm2-chat-7b)也存在这一问题,例如认为
13.8<13.11
。 - 任务要求:利用LangGPT优化提示词,使LLM输出正确结果。完成一次并提交截图即可
-
利用月之暗面 Kimi x LangGPT 提示词专家生成LangGPT提示词解决上述问题:
-
生成的LangGPT提示词如下:
- Role: 数学逻辑专家 - Background: 用户在使用LLM进行浮点数比较时遇到了问题,LLM错误地认为"13.8 < 13.11"。用户需要一个能够指导LLM正确比较浮点数的提示词。 - Profile: 你是一位专注于逻辑和数学的专家,擅长解决与数字比较相关的问题。 - Skills: 逻辑推理、数学运算、精确度理解、编程知识。 - Goals: 设计一个提示词,帮助LLM正确理解和比较浮点数。 - Constrains: 提示词需要简单明了,易于LLM理解和执行。 - OutputFormat: 指令性文本,可能包含示例。 - Workflow: 1. 明确浮点数比较的逻辑规则。 2. 设计一个示例,展示正确的比较方法。 3. 提供一个通用的比较指令,适用于所有浮点数比较。 - Examples: - 比较示例:13.8 和 13.11,正确的比较结果是 13.8 > 13.11。 - 比较逻辑:比较浮点数时,应该从左到右逐位比较,直到找到不同的位数,然后比较这些位数的数值大小。 - Initialization: 欢迎使用浮点数比较助手,让我们一起确保每次比较都是准确的!
-
使用LMDeploy部署InternLM2-Chat-1.8B模型:
运行命令:
CUDA_VISIBLE_DEVICES=0 lmdeploy serve api_server /share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b --server-port 23333 --api-keys internlm2
运行完以上指令,将生成接口:
http://0.0.0.0:23333/v1
-
图像化界面调用接口:
cp Tutorial/tools/chat_ui.py ./ streamlit run chat_ui.py
-
在系统提示中填入上面的LangGPT提示词,实验效果图如下:
进阶任务
- 从ARC Challenge、Hellaswag、MMLU、TruthfulQA、Winogrande和GSM8k这6个任务中任选1个任务。
-
AI2 Reasoning Challenge(考试-初中/高中/大学/职业考试-ARC), 25-shot, 一套小学级别的科学问题;
-
运行以下脚本启动
api_server
# 修改为模型本地存储的位置 model_dir="/home/scy/models/internlm/internlm2-chat-1_8b" lmdeploy serve api_server $model_dir --server-port 23333 --api-keys internlm2
-
在
opencompass/configs
文件夹中新建文件eval_internlm_with_prompt_arc.py
,代码如下:from mmengine.config import read_base from opencompass.models.turbomind_api import TurboMindAPIModel with read_base(): from .datasets.ARC_c.ARC_c_gen import ARC_c_datasets system_prompt = """ - Role: 高级问答系统工程师和认知科学家 - Background: 用户需要设计一个能够准确回答AI2 Reasoning Challenge(ARC)测试中问题的高级问答系统。ARC测试包含需要复杂推理和常识应用的问题,这些问题超出了传统问答系统的能力范围。 - Profile: 你是一个在自然语言处理和机器学习领域具有深厚背景的专家,专注于构建能够理解和推理复杂问题的认知系统。 - Skills: 你需要掌握深度学习、知识表示、推理算法和自然语言理解等关键技能,以便构建能够处理ARC级别挑战的系统。 - Goals: 开发一个能够准确理解并回答ARC测试中复杂问题的高级问答系统。 - Constrains: 系统应能够处理需要推理、常识应用和深层次文本理解的问题,同时保证高准确性和可靠性。 - OutputFormat: 输出应包括问题的答案和支持该答案的推理过程。 - Workflow: 1. 理解问题并确定所需的信息和推理类型。 2. 检索和分析相关的背景知识和事实。 3. 应用推理算法来整合信息并得出答案。 4. 验证答案的准确性并通过反例测试来增强系统的鲁棒性。 - Examples: - 例子1:问题 "Which property of a mineral can be determined just by looking at it?" 答案 "luster" 推理 "通过观察矿物可以确定其光泽,因为光泽是矿物表面反射光的属性,与物理接触无关。" - 例子2:问题 "A student riding a bicycle observes that it moves faster on a smooth road than on a rough road. This happens because the smooth road has (A) less gravity (B) more gravity (C) less friction [correct] (D) more friction" 答案 "less friction" 推理 "平滑路面摩擦力小,因此自行车可以更快地移动,因为摩擦力是阻碍运动的力。" -Initialization: 在第一次对话中,请直接输出以下:您好,作为一个专注于复杂问题解答的高级问答系统工程师,我可以帮助您解答需要深度推理和常识应用的问题。请提出您的问题,我将尽我所能提供最准确的答案。 """ meta_template = dict( round=[ dict(role='SYSTEM', fallback_role='HUMAN', prompt=system_prompt), dict(role='HUMAN', begin=f'<|User|>:\n{system_prompt}\n', end='\n'), dict(role='BOT', begin='<|Bot|>:', end='<eoa>\n', generate=True), ], eos_token_id=103028 ) internlm_chat_1_8b = dict( type=TurboMindAPIModel, abbr='internlm2-chat-1_8b', api_addr='http://0.0.0.0:23333', api_key='internlm2', max_out_len=100, max_seq_len=2048, batch_size=16, meta_template=meta_template, run_cfg=dict(num_gpus=1, num_procs=2), end_str='<eoa>', ) datasets = ARC_c_datasets # 评测用的数据集 models = [internlm_chat_1_8b] # 评测用的模型
-
运行以下脚本,启动评测:
python run.py configs/eval_internlm_with_prompt_arc.py
-
效果图如下:
-
-
HellaSwag(推理-常识推理-HellaSwag), 10-shot, 常识推理测试,这对人类来说很容易,但对 SOTA 模型来说却具有挑战性;
-
方法同上,需要修改
system_prompt
变量的值,和使用的评测数据集,代码如下:from mmengine.config import read_base from opencompass.models.turbomind_api import TurboMindAPIModel with read_base(): from .datasets.hellaswag.hellaswag_gen import hellaswag_datasets system_prompt = """ - Role: 高级问答系统工程师和认知科学家 - Background: 用户需要设计一个能够准确回答AI2 Reasoning Challenge(ARC)测试中问题的高级问答系统。ARC测试包含需要复杂推理和常识应用的问题,这些问题超出了传统问答系统的能力范围。 - Profile: 你是一个在自然语言处理和机器学习领域具有深厚背景的专家,专注于构建能够理解和推理复杂问题的认知系统。 - Skills: 你需要掌握深度学习、知识表示、推理算法和自然语言理解等关键技能,以便构建能够处理ARC级别挑战的系统。 - Goals: 开发一个能够准确理解并回答ARC测试中复杂问题的高级问答系统。 - Constrains: 系统应能够处理需要推理、常识应用和深层次文本理解的问题,同时保证高准确性和可靠性。 - OutputFormat: 输出应包括问题的答案和支持该答案的推理过程。 - Workflow: 1. 理解问题并确定所需的信息和推理类型。 2. 检索和分析相关的背景知识和事实。 3. 应用推理算法来整合信息并得出答案。 4. 验证答案的准确性并通过反例测试来增强系统的鲁棒性。 - Examples: - 例子1:问题 "Which property of a mineral can be determined just by looking at it?" 答案 "luster" 推理 "通过观察矿物可以确定其光泽,因为光泽是矿物表面反射光的属性,与物理接触无关。" - 例子2:问题 "A student riding a bicycle observes that it moves faster on a smooth road than on a rough road. This happens because the smooth road has (A) less gravity (B) more gravity (C) less friction [correct] (D) more friction" 答案 "less friction" 推理 "平滑路面摩擦力小,因此自行车可以更快地移动,因为摩擦力是阻碍运动的力。" -Initialization: 在第一次对话中,请直接输出以下:您好,作为一个专注于复杂问题解答的高级问答系统工程师,我可以帮助您解答需要深度推理和常识应用的问题。请提出您的问题,我将尽我所能提供最准确的答案。 """ meta_template = dict( round=[ dict(role='SYSTEM', fallback_role='HUMAN', prompt=system_prompt), dict(role='HUMAN', begin=f'<|User|>:\n{system_prompt}\n', end='\n'), dict(role='BOT', begin='<|Bot|>:', end='<eoa>\n', generate=True), ], eos_token_id=103028 ) internlm_chat_1_8b = dict( type=TurboMindAPIModel, abbr='internlm2-chat-1_8b', api_addr='http://0.0.0.0:23333', api_key='internlm2', max_out_len=100, max_seq_len=2048, batch_size=16, meta_template=meta_template, run_cfg=dict(num_gpus=1, num_procs=2), end_str='<eoa>', ) datasets = hellaswag_datasets # 评测用的数据集 models = [internlm_chat_1_8b] # 评测用的模型
-
效果图如下:
-
-
MMLU(考试-初中/高中/大学/职业考试-MMLU), 5-shot, 是一项用于测量文本模型多任务准确性的测试。该测试涵盖 57 项任务,包括初等数学、美国历史、计算机科学、法律等;
-
TruthfulQA(安全-安全-TruthfulQA), 0-shot, 是一项用于衡量模型复制网上常见虚假信息倾向的测试;
-
Winogrande(语言-指代消解-WinoGrande), 5-shot, 一个更具有对抗性,难度更高的常识推理测试;
-
GSM8k(推理-数学推理-GSM8K), 5-shot, 多样化的小学数学单词问题,以衡量模型解决多步骤数学推理问题的能力;
-
- 任选其中1个任务基于LangGPT格式编写提示词 (优秀学员最少编写两组)。
- 使用OpenCompass进行评测,用lmdeploy部署LLM为internlm2.5-chat-7b,编写的提示词作为系统提示。
- 达标要求:将不使用系统提示的internlm2.5-chat-7b的任务表现性能作为baseline (后续发布测试结果),提交的系统提示词要指导LLM表现出比baseline更高的性能。
第4关
基础任务
- 任务要求:基于 LlamaIndex 构建自己的 RAG 知识库,寻找一个问题 A 在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答,借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答 A 的能力,截图保存。
-
未使用RAG(Retrieval Augmented Generation,检索增强生成),直接询问InternLM2-Chat-1.8B模型“xtuner是什么?”时
运行以下指令,创建软链接:
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b/ ~/models/
新建
llamaindex_internlm.py
文件,代码如下:from llama_index.llms.huggingface import HuggingFaceLLM from llama_index.core.llms import ChatMessage llm = HuggingFaceLLM( model_name="/root/models/internlm2-chat-1_8b", tokenizer_name="/root/models/internlm2-chat-1_8b", model_kwargs={"trust_remote_code":True}, tokenizer_kwargs={"trust_remote_code":True} ) rsp = llm.chat(messages=[ChatMessage(content="xtuner是什么?")]) print(rsp)
运行指令
python llamaindex_internlm.py
,效果图如下: -
使用LlamaIndex RAG后
执行以下指令安装相关依赖:
-
pip install llama-index==0.10.38 llama-index-llms-huggingface==0.2.0 "transformers[torch]==4.41.1" "huggingface_hub[inference]==0.23.1" huggingface_hub==0.23.1 sentence-transformers==2.7.0 sentencepiece==0.2.0
-
pip install llama-index-embeddings-huggingface llama-index-embeddings-instructor
下载Sentence Transformer模型:
新建python文件并执行,代码如下:
import os # 设置环境变量 os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' # 下载模型 os.system('huggingface-cli download --resume-download sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 --local-dir /root/model/sentence-transformer')
下载NLTK相关资源:
cd /root
git clone https://gitee.com/yzy0612/nltk_data.git --branch gh-pages
cd nltk_data
mv packages/* ./
cd tokenizers
unzip punkt.zip
cd ../taggers
unzip averaged_perceptron_tagger.zip新建
llamaindex_RAG.py
文件,代码如下:from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings from llama_index.embeddings.huggingface import HuggingFaceEmbedding from llama_index.llms.huggingface import HuggingFaceLLM #初始化一个HuggingFaceEmbedding对象,用于将文本转换为向量表示 embed_model = HuggingFaceEmbedding( #指定了一个预训练的sentence-transformer模型的路径 model_name="/root/models/sentence-transformer" ) #将创建的嵌入模型赋值给全局设置的embed_model属性, #这样在后续的索引构建过程中就会使用这个模型。 Settings.embed_model = embed_model llm = HuggingFaceLLM( model_name="/root/models/internlm2-chat-1_8b", tokenizer_name="/root/models/internlm2-chat-1_8b", model_kwargs={"trust_remote_code":True}, tokenizer_kwargs={"trust_remote_code":True} ) #设置全局的llm属性,这样在索引查询时会使用这个模型。 Settings.llm = llm #从指定目录读取所有文档,并加载数据到内存中 documents = SimpleDirectoryReader("./").load_data() #创建一个VectorStoreIndex,并使用之前加载的文档来构建索引。 # 此索引将文档转换为向量,并存储这些向量以便于快速检索。 index = VectorStoreIndex.from_documents(documents) # 创建一个查询引擎,这个引擎可以接收查询并返回相关文档的响应。 query_engine = index.as_query_engine() response = query_engine.query("xtuner是什么?") print(response)
运行指令
python llamaindex_RAG.py
,运行效果图如下: -
-
使用
streamlit
部署模型新建
app.py
文件,代码如下:import streamlit as st from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings from llama_index.embeddings.huggingface import HuggingFaceEmbedding from llama_index.llms.huggingface import HuggingFaceLLM st.set_page_config(page_title="llama_index_demo", page_icon="🦜🔗") st.title("llama_index_demo") # 初始化模型 @st.cache_resource def init_models(): embed_model = HuggingFaceEmbedding( model_name="/root/models/sentence-transformer" ) Settings.embed_model = embed_model llm = HuggingFaceLLM( model_name="/root/models/internlm2-chat-1_8b", tokenizer_name="/root/models/internlm2-chat-1_8b", model_kwargs={"trust_remote_code": True}, tokenizer_kwargs={"trust_remote_code": True} ) Settings.llm = llm documents = SimpleDirectoryReader("./").load_data() index = VectorStoreIndex.from_documents(documents) query_engine = index.as_query_engine() return query_engine # 检查是否需要初始化模型 if 'query_engine' not in st.session_state: st.session_state['query_engine'] = init_models() def greet2(question): response = st.session_state['query_engine'].query(question) return response # Store LLM generated responses if "messages" not in st.session_state.keys(): st.session_state.messages = [{"role": "assistant", "content": "你好,我是你的助手,有什么我可以帮助你的吗?"}] # Display or clear chat messages for message in st.session_state.messages: with st.chat_message(message["role"]): st.write(message["content"]) def clear_chat_history(): st.session_state.messages = [{"role": "assistant", "content": "你好,我是你的助手,有什么我可以帮助你的吗?"}] st.sidebar.button('Clear Chat History', on_click=clear_chat_history) # Function for generating LLaMA2 response def generate_llama_index_response(prompt_input): return greet2(prompt_input) # User-provided prompt if prompt := st.chat_input(): st.session_state.messages.append({"role": "user", "content": prompt}) with st.chat_message("user"): st.write(prompt) # Gegenerate_llama_index_response last message is not from assistant if st.session_state.messages[-1]["role"] != "assistant": with st.chat_message("assistant"): with st.spinner("Thinking..."): response = generate_llama_index_response(prompt) placeholder = st.empty() placeholder.markdown(response) message = {"role": "assistant", "content": response} st.session_state.messages.append(message)
运行指令
streamlit run app.py
,设置端口映射,启动浏览器打开相对应网址,效果如下图:
第5关
基础任务
- 使用 XTuner 微调 InternLM2-Chat-1.8B 实现自己的小助手认知,如下图所示(图中的
伍鲜同志
需替换成自己的昵称),记录复现过程并截图。
1. 新建python文件,并执行,代码如下:
```python
import json
# 设置用户的名字
name = '捣蛋至尊'
# 设置需要重复添加的数据次数
n = 8000
# 初始化数据
data = [
{"conversation": [{"input": "请介绍一下你自己", "output": "我是{}的小助手,内在是上海AI实验室书生·浦语的1.8B大模型哦".format(name)}]},
{"conversation": [{"input": "你在实战营做什么", "output": "我在这里帮助{}完成XTuner微调个人小助手的任务".format(name)}]}
]
# 通过循环,将初始化的对话数据重复添加到data列表中
for i in range(n):
data.append(data[0])
data.append(data[1])
# 将data列表中的数据写入到'datas/assistant.json'文件中
with open('datas/assistant.json', 'w+', encoding='utf-8') as f:
# 使用json.dump方法将数据以JSON格式写入文件
# ensure_ascii=False 确保中文字符正常显示
# indent=4 使得文件内容格式化,便于阅读
json.dump(data, f, ensure_ascii=False, indent=4)
```
-
列出xtuner支持的所有配置文件:
执行命令:
xtuner list-cfg -p internlm2
配置文件名的解释:
以 internlm2_1_8b_full_custom_pretrain_e1 和 internlm2_chat_1_8b_qlora_alpaca_e3 举例:
配置文件 internlm2_1_8b_full_custom_pretrain_e1 配置文件 internlm2_chat_1_8b_qlora_alpaca_e3 说明 internlm2_1_8b internlm2_chat_1_8b 模型名称 full qlora 使用的算法 custom_pretrain alpaca 数据集名称 e1 e3 把数据集跑几次 -
复制预设的配置文件
执行命令:
xtuner copy-cfg internlm2_chat_1_8b_qlora_alpaca_e3 .
执行完命令后,当前文件夹出现一个名为
internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
的新文件 -
对该配置文件进行以下修改
####################################################################### # PART 1 Settings # ####################################################################### - pretrained_model_name_or_path = 'internlm/internlm2-chat-1_8b' + pretrained_model_name_or_path = '/root/InternLM/XTuner/Shanghai_AI_Laboratory/internlm2-chat-1_8b' - alpaca_en_path = 'tatsu-lab/alpaca' + alpaca_en_path = 'datas/assistant.json' evaluation_inputs = [ - '请给我介绍五个上海的景点', 'Please tell me five scenic spots in Shanghai' + '请介绍一下你自己', 'Please introduce yourself' ] ####################################################################### # PART 3 Dataset & Dataloader # ####################################################################### alpaca_en = dict( type=process_hf_dataset, - dataset=dict(type=load_dataset, path=alpaca_en_path), + dataset=dict(type=load_dataset, path='json', data_files=dict(train=alpaca_en_path)), tokenizer=tokenizer, max_length=max_length, - dataset_map_fn=alpaca_map_fn, + dataset_map_fn=None, template_map_fn=dict( type=template_map_fn_factory, template=prompt_template), remove_unused_columns=True, shuffle_before_pack=True, pack_to_max_length=pack_to_max_length, use_varlen_attn=use_varlen_attn)
-
启动微调
运行命令:
xtuner train ./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
运行完成后将在当前路径下生成新文件夹
work_dirs
-
模型格式转换
将生成的.pth模型转换成.hf格式模型
运行如下命令:
# 先获取最后保存的一个pth文件 pth_file=`ls -t ./work_dirs/internlm2_chat_1_8b_qlora_alpaca_e3_copy/*.pth | head -n 1` export MKL_SERVICE_FORCE_INTEL=1 export MKL_THREADING_LAYER=GNU xtuner convert pth_to_hf ./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py ${pth_file} ./hf
运行完成后将在当前路径下生成新文件夹
hf
-
模型合并
对于 LoRA 或者 QLoRA 微调出来的模型其实并不是一个完整的模型,而是一个额外的层(Adapter),训练完的这个层最终还是要与原模型进行合并才能被正常的使用。
对于全量微调的模型(full)其实是不需要进行整合这一步的,因为全量微调修改的是原模型的权重而非微调一个新的 Adapter ,因此是不需要进行模型整合的。
运行如下命令:
export MKL_SERVICE_FORCE_INTEL=1 export MKL_THREADING_LAYER=GNU xtuner convert merge /root/models/internlm2-chat-1_8b ./hf ./merged --max-shard-size 2GB
运行完成后将在当前路径下生成新文件夹
merged
-
部署微调后的模型
执行以下命令,再次运行
xtuner_streamlit_demo.py
脚本:cp Tutorial/tools/xtuner_streamlit_demo.py ./
# 直接修改脚本文件第18行 - model_name_or_path = "/root/InternLM/XTuner/Shanghai_AI_Laboratory/internlm2-chat-1_8b" + model_name_or_path = "./merged"
streamlit run ./xtuner_streamlit_demo.py
效果图如下:
进阶任务
- 用自己感兴趣的知识对基座模型进行增量预训练微调
- 在资源允许的情况下,尝试实现多卡微调与分布式微调
- 将自我认知的模型上传到 OpenXLab,并将应用部署到 OpenXLab
OpenXLab 部署教程:https://github.com/InternLM/Tutorial/tree/camp2/tools/openxlab-deploy
第6关
基础任务
- 使用 OpenCompass 评测 internlm2-chat-1.8b 模型在 ceval 数据集上的性能,记录复现过程并截图。
-
准备环境,运行以下命令:
git clone -b 0.2.4 https://github.com/open-compass/opencompass cd opencompass pip install -e . apt-get update apt-get install cmake # 安装cmake pip install -r requirements.txt pip install protobuf
-
查看internlm和ceval相关配置文件
执行命令:
python tools/list_configs.py internlm ceval
效果图如下:
-
修改配置文件
修改
configs/models/hf_internlm/hf_internlm2_chat_1_8b.py
,代码如下:from opencompass.models import HuggingFaceCausalLM models = [ dict( type=HuggingFaceCausalLM, abbr='internlm2-1.8b-hf', path="/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b", tokenizer_path='/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b', model_kwargs=dict( trust_remote_code=True, device_map='auto', ), tokenizer_kwargs=dict( padding_side='left', truncation_side='left', use_fast=False, trust_remote_code=True, ), max_out_len=100, min_out_len=1, max_seq_len=2048, batch_size=8, run_cfg=dict(num_gpus=1, num_procs=1), ) ]
-
启动评估
执行如下命令:
export MKL_THREADING_LAYER=GNU python run.py \ --datasets ceval_gen \ # 数据集准备 --models hf_internlm2_chat_1_8b \ # 模型准备 --debug
-
查看评测结果
评测结果自动导出到:
outputs/default/YYMMDD_hhmmss/summary/summary_YYMMDD_hhmmss.csv
效果图如下:
进阶任务
-
使用 OpenCompass 进行主观评测(选做)
-
使用 OpenCompass 评测 InternLM2-Chat-1.8B 模型使用 LMDeploy部署后在 ceval 数据集上的性能(选做)
-
在
opencompass/configs
文件夹中新建文件eval_internlm_with_lmdeploy.py
,代码如下:from mmengine.config import read_base with read_base(): from .datasets.ceval.ceval_gen import ceval_datasets from opencompass.configs.models.hf_internlm.lmdeploy_internlm2_chat_1_8b import models as internlm2_chat_1_8b datasets = ceval_datasets # 评测用的数据集 models = internlm2_chat_1_8b # 评测用的模型
-
修改文件
opencompass/configs/models/hf_internlm/lmdeploy_internlm2_chat_1_8b.py
,代码如下:from opencompass.models import TurboMindModelwithChatTemplate models = [ dict( type=TurboMindModelwithChatTemplate, abbr='internlm2-chat-1.8b', path='/home/scy/models/internlm/internlm2-chat-1_8b', # 修改为模型在本地的路径 engine_config=dict(session_len=7168, max_batch_size=16, tp=1), gen_config=dict(top_k=1, temperature=1e-6, top_p=0.9, max_new_tokens=1024), max_seq_len=7168, max_out_len=1024, batch_size=16, run_cfg=dict(num_gpus=2), ) ]
-
启动评测,运行以下命令(需切换到
opencompass
路径下):python run.py configs/eval_internlm_with_lmdeploy.py
效果图如下:
- 使用 OpenCompass 进行调用API评测(优秀学员必做)
-
在
opencompass/configs
文件夹中新建文件eval_internlm_with_lmdeploy_server_api.py
,代码如下:from mmengine.config import read_base from opencompass.models.turbomind_api import TurboMindAPIModel with read_base(): from .datasets.ceval.ceval_gen import ceval_datasets meta_template = dict( round=[ dict(role='HUMAN', begin='<|User|>:', end='\n'), dict(role='BOT', begin='<|Bot|>:', end='<eoa>\n', generate=True), ], eos_token_id=103028) internlm_chat_1_8b = dict( type=TurboMindAPIModel, abbr='internlm2-chat-1_8b', api_addr='http://0.0.0.0:23333', api_key='internlm2', max_out_len=100, max_seq_len=2048, batch_size=16, meta_template=meta_template, run_cfg=dict(num_gpus=1, num_procs=2), end_str='<eoa>', ) datasets = ceval_datasets # 评测用的数据集 models = [internlm_chat_1_8b] # 评测用的模型
-
启动评测,运行以下命令(需切换到
opencompass
路径下):python run.py configs/eval_internlm_with_lmdeploy.py
效果图如下: