Gradient AI Cloud 上的 LLAMA2 模型自动微调

慈云数据 2024-03-13 技术支持 40 0

介绍

欢迎来到大型语言模型( LLM )的世界。过去,迁移学习是深度学习中最常用的概念。然而,2018年,《Universal Language Model Fine-tuning for Text Classification》论文改变了自然语言处理( NLP )的整个格局。本文探讨了使用微调和迁移学习的模型。

LLAMA2 是用于文本生成的最佳 LLM 模型之一。在本指南中,我们将探索使用个人数据微调 LLAMA2 模型的自动过程。所有这一切均由Gradient AI提供支持。Gradient AI是一个提供Python SDK的云平台,使我们能够创建、测试和轻松管理模型。

d85d46c1b0b680972b388bdc7e83eb9a.jpeg

这个过程将需要很长时间!那么让我们开始并做好准备吧!

学习目标
  • 了解 LLAMA2 及其主要功能和用例。

  • 探索 Gradient AI,了解其主要功能、用例并进行比较。

  • 获取模块化编码概念的知识,以提高组织的生产力和代码的重用性。

  • 通过模型初始化和微调,获取有关使用 LLAMA2 迁移学习的知识。

  • 了解Gradient AI 的概念,例如创建 ID 和密钥。

  • 了解 Streamlit 为机器学习应用程序创建交互式且用户友好的 UI。

    目录
    1. 什么是LLAMA2?

    2. 什么是Gradient AI云

    3. 创建工作区 ID 和访问令牌

    4. 使用模块化编码构建自动微调应用程序

    5. 项目架构图

    6. 微调流程图

    7. 分步项目设置

    8. 创建Loger和异常

    9. 创建样例

    10. 创建常量

    11. 创建 fine_tune.py

    12. 创建 Streamlit 应用程序 (app.py)

    13. 常见问题

    14. 学习资源

    什么是LLAMA2?

    LLAMA2,即多应用大型语言模型,属于大型语言模型(LLM)的范畴。该模型由 Facebook (Meta) 开发,旨在探索广泛的自然语言处理 (NLP) 应用。在早期的系列中,“LAMA”模型是开发的起始面,但它使用了过时的方法。

    正如我在简介中提到的,关键时刻出现在 2018 年《Universal Language Model Fine-tuning for Text Classification》论文中。本文通过深度学习技术和预训练方法彻底改变了 NLP 领域,极大地提高了不同 NLP 应用程序的性能。

    主要特征:
    1. 多功能性: LLAMA2 是一款功能强大的模型,能够高精度、高效率地处理各种任务

    2. 语境理解:在序列到序列的学习中,我们探索音素、语素、词位、语法和语境。LLAMA2 可以更好地理解上下文的细微差别。

    3. 迁移学习: LLAMA2 是一个强大的模型,受益于对大型数据集的广泛训练。迁移学习促进了它对特定任务的快速适应。

    4. 开源:在数据科学中,一个关键方面是社区。当模型开源时,这一切就成为可能,允许研究人员、开发人员和社区探索、调整模型并将其集成到他们的项目中。

    用例:
    1. LLAMA2 可以帮助创建文本生成任务,例如故事写作、内容创建等。

    2. 我们知道零样本学习的重要性。所以,我们可以使用 LLAMA2 来完成问答任务,类似于 ChatGPT。它提供相关且准确的响应。

    3. 对于语言翻译,市场上我们有API,但是我们需要订阅。但LLAMA2免费提供语言翻译,使其易于使用。

    4. LLAMA2 易于使用,是开发聊天机器人的绝佳选择。

    与其他平台的比较:

    a367e0cdb4923b3106fd12f7091a1619.png

    什么是Gradient AI云

    Gradient AI 是一个云平台,为用户提供多功能工具来轻松构建、测试和更新模型。使用此类工具是一种常见方法,因为许多行业都利用云基础设施进行模型创建和测试。该平台简化了构建、训练和部署模型的流程,并提供了测试用例。这为用户、研究人员和企业提供了便捷的解决方案

    主要特征:
    1. 可扩展性:在云平台中,可扩展性对于按需提供易于扩展的服务至关重要。Gradient AI是一个功能强大的云平台,可以轻松提供此类服务。

    2. 易于使用:Gradient AI 的 UI 非常人性化。用户可以轻松创建用于模型创建的 ID 和密钥。UI 的设计易于使用,尤其是对于新用户。

    3. 协作:该平台通过提供共享工作空间、版本控制和协作工具来支持协作,从而促进机器学习或 GenAI 项目中的团队合作。

    4. 多样化的框架支持:Gradient AI Cloud支持多种机器学习框架,允许用户使用TensorFlow、PyTorch和scikit-learn等流行的库。

    用例:
    1. 我们可以使用Python SDK创建模型并轻松训练它们。此外,还可以使用 UI 创建模型以进行简单的训练。这有助于优化计算资源。

    2. 该平台适用于微调预训练模型,使用户能够使模型适应特定任务或领域。

    3. Gradient AI Cloud 简化了机器学习模型的部署和托管,为实时预测提供基础设施。

    4. Gradient AI Cloud 支持从数据准备到模型训练和部署的端到端数据科学工作流程。

    与其他平台的比较:

    02d8c858a10fa252b54654ac4c48d742.png

    创建工作区 ID 和访问令牌

    创建GRADIENT_WORKSPACE_ID和GRADIENT_ACCESS_TOKEN涉及从 Gradient AI 云平台获取必要的凭据。

    以下是创建这些变量的步骤:

    1. 工作空间 ID (GRADIENT_WORKSPACE_ID):

    • 登录你的 Gradient AI 帐户。

    • 导航到要获取其 ID 的工作区或项目。

    • 在 URL 中查找工作区 ID。它通常显示为长字母数字字符串。

    • 复制 id 并将其粘贴到编码部分中我们想要的位置。(.env)

      be4daf76e97333f36b3defe5b1144138.jpeg

      图:Gradient AI 的 UI(工作区)

      1b8c6be3664a64502431b4cb9247df83.jpeg

      图:Gradient AI 的 UI(验证密钥)

      2. 访问令牌(GRADIENT_ACCESS_TOKEN):

      • 检查右侧选项 Access Tokens 并单击它

      • 复制密钥并将其粘贴到我们想要的编码部分中的某个位置。(.env)

        e7b8d8ac2cdd9ed5d73023cddff8d3fa.jpeg

        图:Gradient AI 的 UI(验证密钥)

        使用模块化编码构建自动微调应用程序

        构建自动微调应用程序涉及多个步骤,为了简化流程,我们建立了一个结构化的工作流程。模块化编码的核心元素是创建记录器和异常脚本,负责捕获日志和错误。以下是编码结构的高级概述。

        最后,我们将 Streamlit 应用程序集成为用户友好的 UI,从视觉上简化了组件,以便任何人都可以测试该应用程序。

        项目结构
        project_root
        │
        ├── configs
        │
        ├── research
        │   └── trials.ipynb
        ├── logs
        │
        ├── src
        │   └── lama2FineTune
        │       ├── component
        │       │   └── fine_tune.py
        │       ├── constant
        │       │   └── env_variable.py
        │       ├── exception
        │       ├── logger
        │       ├── utils
        │       │   └── main_utils.py
        │       └── __init__.py
        │
        ├── venv
        ├── .env
        ├── .gitignore
        ├── init_setup.sh
        ├── params.yaml
        ├── app.py
        ├── README.md
        ├── requirements.txt
        ├── setup.py
        dfc0b839e240302448673e2e0e196ce6.jpeg

        图:编码结构 UI

        项目架构图

        80e7eea33dc9cca61a15d1adbea83a5d.jpeg

        图:项目架构

        • Streamlit 应用程序提供了一个带有“Finetune”按钮的用户界面。

        • 当按下按钮时,Streamlit 应用程序将触发 FineTuner 类。

        • FineTuner 类使用 Gradient AI 初始化 LLAMA2 模型,创建或加载模型,对其进行微调,并将微调后的模型保存在本地。

        • 微调后的模型可以上传到Gradient AI平台进行进一步的部署和管理。

        • 本地机器可以保存和加载基本模型和微调模型。

        • 云上的 Gradient AI 处理模型服务、资源管理、可扩展性和协作。

          该架构允许对 LLAMA2 模型进行高效微调,并与 Gradient AI 平台无缝集成。

          微调流程图

          1491710a7085d9ccf67e816a6ab2dd52.jpeg

          图:LLM2微调图

          该图集成了用于用户交互的 Streamlit 应用程序、用于 LLAMA2 微调的 FineTuner 类、用于云通信的 Gradient SDK 以及模块化编码组件,确保在 Gradient AI 上定制和部署 LLAMA2 模型的简化流程。

          分步项目设置

          步骤 1 克隆 GitHub 存储库
          git clone https://github.com/SuyodhanJ6/Fine-Tune-LLAMA2.git
          步骤 2 更改目录
          ls 
          o/p : Fine-Tune-LLAMA2
          cd Fine-Tune-LLAMA2
          步骤 3 创建虚拟环境
          • Python 安装: 确保你的计算机上安装了 Python。 你可以从官方下载并安装 Python:https://www.python.org/downloads/

          • 虚拟环境创建:创建虚拟环境

            conda create -p ./venv python=3.9 -y
            步骤 4 虚拟环境激活
            • 激活 ./venv(确保 venv 文件夹存在于当前目录中。)

              conda activate ./venv
              步骤 5 安装依赖
              • 要安装requirements.txt文件中列出的所需软件包,你可以在终端或命令提示符中使用以下命令:

                pip install -r requirements.txt
                步骤 6 创建 .env 文件并编辑 .env
                • 创建 .env:打开终端 (Ubuntu) 或 bash (Windows),在命令下方键入。

                  touch .env
                  • 更新 API 密钥 (.env)

                    GRADIENT_WORKSPACE_ID=Past your key
                    GRADIENT_ACCESS_TOKEN=Past your key

                    创建Logger 和异常

                    lama2FineTune
                    │   ├── exception
                    │   │   └── __init__.py
                    │   ├── logger
                    │   │   └── __init__.py

                    Logger 文件:

                    Logger 文件对于记录和存储代码(函数、类、脚本名称)信息非常重要,具有多种关键功能:

                    1. 调试:提供程序执行过程中事件的详细日志,帮助识别和解决问题。

                    2. 性能监控:监控应用程序性能,协助代码优化和效率提升。

                    3. 错误跟踪:能够有效跟踪错误,从而更快地进行故障排除和解决。

                    4. 审计跟踪:作为重要系统事件和操作的记录。

                    5. 实时监控:有助于实时监控应用程序的行为,有助于主动检测问题。

                    import logging
                    import os
                    from datetime import datetime
                    import os
                    LOG_FILE = f"{datetime.now().strftime('%m_%d_%Y_%H_%M_%S')}.log"
                    logs_path = os.path.join(os.getcwd(), "logs", LOG_FILE)
                    os.makedirs(logs_path, exist_ok=True)
                    LOG_FILE_PATH = os.path.join(logs_path, LOG_FILE)
                    logging.basicConfig(
                        filename=LOG_FILE_PATH,
                        format="[ %(asctime)s ] %(lineno)d %(name)s - %(levelname)s - %(message)s",
                        level=logging.INFO,
                    )

                    异常文件:

                    异常文件旨在管理程序运行期间的意外事件或错误以及关键重要性:

                    1. 错误处理:捕获和管理错误,防止程序突然终止。

                    2. 用户反馈:提供一种机制,向用户提供有意义的错误消息,提供发生错误的行号以及哪个脚本和理解。

                    3. 根本原因分析:帮助确定问题的根本原因,并指导开发人员进行必要的改进。

                    import sys
                    def error_message_detail(error, error_detail: sys):
                        """
                        Method Name : error_message_detail
                        Description : Format and return an error message with traceback details.
                        Return : str
                        Args  :
                            error (Exception): The error object or message.
                            error_detail (sys): The traceback information from the error.
                        """
                        _, _, exc_tb = error_detail.exc_info()
                        file_name = exc_tb.tb_frame.f_code.co_filename
                        error_message = "Error occurred in python script name 
                        [{0}] at line number [{1}]. Error message: {2}".format(
                            file_name, exc_tb.tb_lineno, str(error)
                        )
                        return error_message
                    class McqGeneratorException(Exception):
                        """
                        Custom exception class for handling money laundering-related errors.
                        """
                        def __init__(self, error_message, error_detail: sys):
                            """
                            Method Name : __init__
                            Description : Initialize the MoneyLaunderingException exception.
                            Return : None
                            Args  :
                                error_message (str): The main error message.
                                error_detail (sys): Additional details about the error.
                            """
                            super().__init__(error_message)
                            self.error_message_detail = error_detail
                        def __str__(self):
                            """
                            Method Name : __str__
                            Description : Return a string representation of the 
                            MoneyLaundering exception.
                            Return : str
                            Args  : None
                            """
                            return str(self.error_message_detail)

                    创建样例

                    1.RESPONSE_JSON

                    lama2FineTune
                    │   ├── config
                    │   │   └── __init__.py

                    注意:在我提供的上述部分中写下你想要的所有示例。

                    SAMPLES = [
                        {
                            "inputs": "### Instruction: Who is Prashant Malge? \n\n### Response:
                             Prashant Malge is a dedicated fourth-year Computer Science student
                              at DPCOE - Dhole Patil College Of Engineering Pune, with a strong 
                              passion for data science. He has a solid foundation in programming
                              , databases, and machine learning."
                        },
                        {
                            "inputs": "### Instruction: Tell me about Prashant Malge's academic
                             journey. \n\n### Response: Prashant Malge's academic journey has 
                             equipped him with a solid foundation in programming, databases, and 
                             machine learning. He is currently a fourth-year student at DPCOE -
                              Dhole Patil College Of Engineering Pune."
                        },
                        {
                            "inputs": "### Instruction: What skills does Prashant Malge possess?
                             \n\n### Response: Prashant Malge possesses skills in statistical
                              analysis, machine learning, and data visualization. As a Data 
                              Scientist, he leverages his expertise to derive insights and make
                               informed decisions."
                        },
                        {
                            "inputs": "### Instruction: Where has Prashant Malge gained hands-on
                             experience in data science? \n\n### Response: Prashant Malge gained 
                             hands-on experience in data science through two internships at 
                             inuron.ai. During these internships, he addressed complex data
                              problems and collaborated effectively with stakeholders."
                        },
                        {
                            "inputs": "### Instruction: How does Prashant Malge approach data
                             problems? \n\n### Response: Prashant Malge excels in addressing 
                             complex data problems and is known for his collaborative approach.
                              He works effectively with stakeholders to deliver scalable and 
                              secure data solutions."
                        },
                        {
                            "inputs": "### Instruction: What are Prashant Malge's interests 
                            outside of data science? \n\n### Response: Beyond his technical 
                            pursuits, Prashant Malge has a deep love for tea and a passion for
                             sports. He has played softball for years, representing Kolhapur in 
                             state-level competitions three times."
                        },
                        {
                            "inputs": "### Instruction: Can you share Prashant Malge's 
                            personal website? \n\n### Response: Prashant Malge's personal 
                            website is available at https://suyodhanj6.github.io/"
                        }
                    ]

                    创建常量

                    lama2FineTune
                    │   ├── constants
                    │   │   └── env_variable.py
                            └── __init__.py
                    • 首先在env_variable.py脚本中导入 .env 变量。

                      # Loading OPENAI_API_KEY
                      from dotenv import load_dotenv
                      import os
                      # take environment variables from .env.
                      load_dotenv()  
                      """ Workspace Constants """
                      GRADIENT_WORKSPACE_ID=os.getenv("GRADIENT_WORKSPACE_ID")
                      """ Access token of gradients"""
                      GRADIENT_ACCESS_TOKEN=os.getenv("GRADIENT_ACCESS_TOKEN")
                      • 在 init.py 脚本中导入我们正在使用管道的项目常量。

                        # Other constants from params.yaml
                        MODEL_ADAPTER_NAME = "PrashantModelAdapter"
                        NUM_EPOCHS = 3

                        创建fine_tune.py

                        lama2FineTune
                        │   ├── component
                        │   │   └── fine_tune.py
                        import os
                        import sys
                        import logging
                        from datetime import datetime
                        from gradientai import Gradient
                        from lama2FineTune.constants.env_varaible import GRADIENT_WORKSPACE_ID, GRADIENT_ACCESS_TOKEN
                        from lama2FineTune.logger import logging
                        from lama2FineTune.exception import Llama2Exception
                        class FineTuner:
                            def __init__(self, model_name, num_epochs):
                                self.model_name = model_name
                                self.num_epochs = num_epochs
                                self.gradient = None
                                self.model_adapter = None
                            def initialize_gradient(self):
                                # Initialize Gradient AI Cloud with credentials
                                self.gradient = Gradient(workspace_id=GRADIENT_WORKSPACE_ID, 
                                access_token=GRADIENT_ACCESS_TOKEN)
                            def create_model_adapter(self):
                                # Create model adapter with the specified name
                                base_model = self.gradient.get_base_model(base_model_slug="nous-hermes2")
                                model_adapter = base_model.create_model_adapter(name=self.model_name)
                                return model_adapter
                            def fine_tune_model(self, samples):
                                # Fine-tune the model using the provided samples and number of epochs
                                for epoch in range(self.num_epochs):
                                    for sample in samples:
                                        query = sample["inputs"]
                                        response = sample["response"]
                                        self.model_adapter.fine_tune(inputs=query, targets=response)
                            def fine_tune(self):
                                try:
                                    # Initialize logging
                                    # Initialize Gradient AI Cloud
                                    self.initialize_gradient()
                                    # Create model adapter
                                    self.model_adapter = self.create_model_adapter()
                                    logging.info(f"Created model adapter with id {self.model_adapter.id}")
                                    # Fine-tune the model
                                    self.fine_tune_model(SAMPLES)
                                except Exception as e:
                                    # Handle exceptions using custom exception class and logging
                                   raise Llama2Exception(e, sys)
                                finally:
                                    # Clean up resources if needed
                                    if self.model_adapter:
                                        self.model_adapter.delete()
                                    if self.gradient:
                                        self.gradient.close()
                        # if __name__ == "__main__":
                        #     # Example usage
                        #     fine_tuner = FineTuner(model_name=MODEL_ADAPTER_NAME, num_epochs=NUM_EPOCHS)
                        #     fine_tuner.fine_tune()

                        创建 Streamlit 应用程序(app.py)

                        # app.py
                        import streamlit as st
                        from lama2FineTune.components.fine_tune import FineTuner
                        from lama2FineTune.constants import MODEL_ADAPTER_NAME, NUM_EPOCHS
                        def main():
                            st.title("LLAMA2 Fine-Tuning App")
                            # Get user input for model name and number of epochs
                            model_name = st.text_input("Enter Model Name", value=MODEL_ADAPTER_NAME)
                            num_epochs = st.number_input("Enter Number of Epochs", min_value=1, value=NUM_EPOCHS)
                            # Display fine-tuning button
                            if st.button("Fine-Tune Model"):
                                fine_tuner = FineTuner(model_name=model_name, num_epochs=num_epochs)
                                # Perform fine-tuning
                                st.info(f"Fine-tuning model {model_name} for {num_epochs} epochs. 
                                This may take some time...")
                                fine_tuner.fine_tune()
                                st.success("Fine-tuning completed successfully!")
                                # Display generated output after fine-tuning
                                sample_query = "### Instruction: Who is Prashant Malge? \n\n ### Response:"
                                completion = fine_tuner.model_adapter.complete(query=sample_query, 
                                max_generated_token_count=100).generated_output
                                st.subheader("Generated Output (after fine-tuning):")
                                st.text(completion)
                        if __name__ == "__main__":
                            main()
                        • 运行这个脚本

                          streamlit run app.py
                          9a1ca888240c69e6ed97ed766ab71e7d.jpeg

                          图:Fine-Tune 应用程序的 UI

                          c048a1e630b3703dc2847f6cb3c9048e.jpeg

                          图:Gradient AI 的 UI(模型创建)

                          注意:如果你需要分步说明,请参阅 GitHub 存储库:https://github.com/SuyodhanJ6/Fine-Tune-LLAMA2/blob/main/research/trials.ipynb

                          结论

                          总之,我们探索了项目结构,通过迁移学习开发了个性化模型,并构建了模块化编码方法。该项目采用结构化且有组织的流程,利用个性化数据来完善 LLAMA2 语言模型。关键元素包括 Streamlit 应用程序 (app.py)、微调管道 (fine_tune.py) 以及用于常量、异常、日志记录和实用程序的其他模块。该设计优先考虑清晰度、易于维护和改进的用户体验

                          要点
                          • 执行迭代测试以评估微调的 LLAMA2 模型。

                          • 利用 Gradient AI 云进行模型训练和部署。

                          • 将 Gradient AI 云与 Python SDK 集成。

                          • 了解迁移学习的概念及其在 LLAMA2 中的应用。

                          • 认识模块化编码的好处并学习项目中的行业标准代码结构。

                          • 探索创建项目布局并建立自动化管道以实现高效开发。

                            常见问题

                            Q1:为什么在项目设计中优先考虑模块化社区?

                            答:模块化社区对于代码清晰度、可维护性和可扩展性至关重要,这是通过根据特定功能隔离分支来实现的。

                            Q2:Streamlit 应用程序在项目中的主要用途是什么?

                            答:Streamlit 应用程序提供了一个 UI 界面,用于与 LLAMA2 微调过程进行交互。用户可以通过界面输入参数并启动自动微调。

                            Q3:什么是 LLAMA2?它如何应用迁移学习?

                            答:LLAMA2 是一个专为自然语言处理任务设计的大型语言模型。它通过允许使用个人数据集对特定领域或任务进行微调来支持迁移学习。

                            Q4:迁移学习如何应用于 LLAMA2 来完成特定的自然语言处理任务?

                            答:使用 LLAMA2 进行迁移学习涉及使用预先训练的权重初始化模型,并根据特定领域或特定任务的数据对其进行微调,使其知识适应目标应用程序

                            Q5:项目如何管理日志记录和异常处理?

                            答:该项目强调日志记录以提高运行时可见性,并利用业务异常来改进错误报告,从而有助于构建更强大的系统。

                            学习资源

                            • GitHub 存储库:https://github.com/SuyodhanJ6/Fine-Tune-LLAMA2

                            • LLAMA2 文档:https://ai.meta.com/llama/

                            • Gradient AI平台:https://auth.gradient.ai/select-workspace

                            • LLAMA2 研究论文:https://arxiv.org/abs/2307.09288

                              ☆ END ☆

                              如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

                              ↓扫描二维码添加小编↓

                              2539cb231080801d73fdce0adfd3b8ae.jpeg

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon