闯关地图-基础岛

基础岛

第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)

效果图如下:

img

进阶任务

  • 使用 LMDeploy 完成 InternLM-XComposer2-VL-1.8B 的部署,并完成一次图文理解对话,记录复现过程并截图。(优秀学员必做)

  • 使用 LMDeploy 完成 InternVL2-2B 的部署,并完成一次图文理解对话,记录复现过程并截图。(优秀学员必做)

  1. 使用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,效果图如下:

    img

  2. 使用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

    效果图如下:

    img

  3. 使用LMDeploy部署InternVL2-2B模型

    执行命令(在上一步的基础上):

    lmdeploy serve gradio /share/new_models/OpenGVLab/InternVL2-2B --cache-max-entry-count 0.1

    效果图如下:

    img

第3关

基础任务

  • 背景问题:近期相关研究发现,LLM在对比浮点数字时表现不佳,经验证,internlm2-chat-1.8b (internlm2-chat-7b)也存在这一问题,例如认为13.8<13.11
  • 任务要求:利用LangGPT优化提示词,使LLM输出正确结果。完成一次并提交截图即可
  1. 利用月之暗面 Kimi x LangGPT 提示词专家生成LangGPT提示词解决上述问题:

    img

  2. 生成的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: 欢迎使用浮点数比较助手,让我们一起确保每次比较都是准确的!
    
  3. 使用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

  4. 图像化界面调用接口:

    cp Tutorial/tools/chat_ui.py ./
    streamlit run chat_ui.py
    
  5. 在系统提示中填入上面的LangGPT提示词,实验效果图如下:

    img

进阶任务

  • 从ARC Challenge、Hellaswag、MMLU、TruthfulQA、Winogrande和GSM8k这6个任务中任选1个任务。
    • AI2 Reasoning Challenge(考试-初中/高中/大学/职业考试-ARC), 25-shot, 一套小学级别的科学问题;

      1. 运行以下脚本启动api_server

        # 修改为模型本地存储的位置
        model_dir="/home/scy/models/internlm/internlm2-chat-1_8b"
        lmdeploy serve api_server $model_dir --server-port 23333 --api-keys internlm2
        
      2. 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]  # 评测用的模型
        
      3. 运行以下脚本,启动评测:

        python run.py configs/eval_internlm_with_prompt_arc.py

      4. 效果图如下:

        img

    • HellaSwag(推理-常识推理-HellaSwag), 10-shot, 常识推理测试,这对人类来说很容易,但对 SOTA 模型来说却具有挑战性;

      1. 方法同上,需要修改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]  # 评测用的模型
        
      2. 效果图如下:

        img

    • 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 的能力,截图保存。
  1. 未使用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,效果图如下:

    img

  2. 使用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,运行效果图如下:

    img

  3. 使用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,设置端口映射,启动浏览器打开相对应网址,效果如下图:

    img

第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)
```
  1. 列出xtuner支持的所有配置文件:

    执行命令:xtuner list-cfg -p internlm2

    配置文件名的解释:

    internlm2_1_8b_full_custom_pretrain_e1internlm2_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 把数据集跑几次
  2. 复制预设的配置文件

    执行命令:xtuner copy-cfg internlm2_chat_1_8b_qlora_alpaca_e3 .

    执行完命令后,当前文件夹出现一个名为internlm2_chat_1_8b_qlora_alpaca_e3_copy.py的新文件

  3. 对该配置文件进行以下修改

    #######################################################################
    #                          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)
    
  4. 启动微调

    运行命令:xtuner train ./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py

    运行完成后将在当前路径下生成新文件夹work_dirs

  5. 模型格式转换

    将生成的.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

  6. 模型合并

    对于 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

  7. 部署微调后的模型

    执行以下命令,再次运行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

    效果图如下:

    img

进阶任务

  • 用自己感兴趣的知识对基座模型进行增量预训练微调
  • 在资源允许的情况下,尝试实现多卡微调与分布式微调
  • 将自我认知的模型上传到 OpenXLab,并将应用部署到 OpenXLab

OpenXLab 部署教程:https://github.com/InternLM/Tutorial/tree/camp2/tools/openxlab-deploy

第6关

基础任务

  • 使用 OpenCompass 评测 internlm2-chat-1.8b 模型在 ceval 数据集上的性能,记录复现过程并截图。
  1. 准备环境,运行以下命令:

    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
    
  2. 查看internlm和ceval相关配置文件

    执行命令:python tools/list_configs.py internlm ceval

    效果图如下:

    img

  3. 修改配置文件

    修改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),
        )
    ]
    
  4. 启动评估

    执行如下命令:

    export MKL_THREADING_LAYER=GNU
    python run.py \
        --datasets ceval_gen \ # 数据集准备
        --models hf_internlm2_chat_1_8b \  # 模型准备
        --debug
    
  5. 查看评测结果

    评测结果自动导出到:outputs/default/YYMMDD_hhmmss/summary/summary_YYMMDD_hhmmss.csv

    效果图如下:

    img

进阶任务

  • 使用 OpenCompass 进行主观评测(选做)

  • 使用 OpenCompass 评测 InternLM2-Chat-1.8B 模型使用 LMDeploy部署后在 ceval 数据集上的性能(选做)

  1. 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  # 评测用的模型
    
  2. 修改文件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),
        )
    ]
    
  3. 启动评测,运行以下命令(需切换到opencompass路径下):

    python run.py configs/eval_internlm_with_lmdeploy.py

    效果图如下:

    img

  • 使用 OpenCompass 进行调用API评测(优秀学员必做)
  1. 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]  # 评测用的模型
    
  2. 启动评测,运行以下命令(需切换到opencompass路径下):

    python run.py configs/eval_internlm_with_lmdeploy.py

    效果图如下:

    img

posted @ 2024-07-22 15:07  MaximeSHE  阅读(27)  评论(0编辑  收藏  举报