日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

面向NL2BI的大模型微調(diào)最佳實(shí)踐

本文以Qwen系列大模型為例,介紹如何在人工智能平臺PAI上構(gòu)建從訓(xùn)練數(shù)據(jù)生成、模型微調(diào)訓(xùn)練到服務(wù)部署和調(diào)用的NL2BI全鏈路解決方案。

背景信息

NL2SQL(自然語言生成SQL)技術(shù)旨在將自然語言轉(zhuǎn)換為數(shù)據(jù)庫查詢語句,使得即使不熟悉SQL的用戶也能輕松地從數(shù)據(jù)庫中提取數(shù)據(jù)進(jìn)行分析,從而提高決策效率并深入挖掘數(shù)據(jù)背后的商業(yè)洞察(NL2BI)。

通過將NL2SQL與當(dāng)前先進(jìn)的大型語言模型相結(jié)合,可以顯著增強(qiáng)語義理解能力,并支持更復(fù)雜的SQL語法生成,實(shí)現(xiàn)更精準(zhǔn)的SQL查詢和更流暢的數(shù)據(jù)提取分析體驗(yàn)。

盡管如此,NL2BI的應(yīng)用場景仍面臨諸多挑戰(zhàn),例如LLM推理服務(wù)的高成本和對業(yè)務(wù)語義理解能力的不足。為了解決這些問題,通常需要在您自己的業(yè)務(wù)場景下,對LLM的NL2BI能力進(jìn)行微調(diào)訓(xùn)練。本方案的數(shù)據(jù)生產(chǎn)過程采用Qwen2-72B-Instruct大語言模型,模型微調(diào)采用CodeQwen1.5-7B-Chat模型。

使用流程

基于LLM的NL2BI全鏈路解決方案的使用流程如下:

image
  1. 準(zhǔn)備數(shù)據(jù)集

    您可以參照數(shù)據(jù)格式要求和數(shù)據(jù)準(zhǔn)備策略,并針對特定的業(yè)務(wù)場景準(zhǔn)備相應(yīng)的訓(xùn)練數(shù)據(jù)集。由于NL2SQL人工標(biāo)注需要較大的工作量,您可以使用PAI-DLC及Qwen2-72B大模型進(jìn)行批量數(shù)據(jù)生成,用于后續(xù)的模型訓(xùn)練。

  2. 訓(xùn)練模型

    在快速開始中,基于CodeQwen1.5-7B-Chat模型進(jìn)行訓(xùn)練。

  3. 部署及調(diào)用模型服務(wù)

    通過快速開始將訓(xùn)練好的模型部署為EAS在線服務(wù)。

前提條件

在開始執(zhí)行操作前,請確認(rèn)您已完成以下準(zhǔn)備工作:

使用限制

僅支持在華北6(烏蘭察布)地域,使用以下靈駿智算資源,基于PAI-DLC和Qwen2-72B大模型進(jìn)行批量數(shù)據(jù)生成:

  • ml.gu7xf.8xlarge-gu108

  • ml.gu8xf.8xlarge-gu108

準(zhǔn)備數(shù)據(jù)集

支持使用以下兩種方式準(zhǔn)備訓(xùn)練數(shù)據(jù),本方案以方式二為例,為您介紹如何準(zhǔn)備訓(xùn)練數(shù)據(jù):

數(shù)據(jù)準(zhǔn)備策略

為了提升訓(xùn)練的有效性和穩(wěn)定性,您可以參考以下策略準(zhǔn)備相關(guān)數(shù)據(jù):

  • 數(shù)據(jù)庫DDL優(yōu)化

    • 盡量減少表中存在歧義的字段,并對所有字段添加詳細(xì)的文本說明。

    • 測試模型在處理最多3個表格、包含20列左右的場景時,準(zhǔn)確率較優(yōu)。

    示例數(shù)據(jù)如下:

    正確示例

    CREATE TABLE `orders` (
      `Row ID` int(11) DEFAULT NULL COMMENT '行的唯一標(biāo)識符',
      `Order ID` varchar(14) DEFAULT NULL COMMENT '訂單的唯一標(biāo)識符',
      `Order Date` date DEFAULT NULL COMMENT '下單日期',
      `Ship Date` date DEFAULT NULL COMMENT '發(fā)貨日期',
      `Ship Mode` varchar(15) DEFAULT NULL COMMENT '發(fā)貨方式',
      `Customer ID` varchar(8) DEFAULT NULL COMMENT '客戶的唯一標(biāo)識符',
      `Customer Name` varchar(25) DEFAULT NULL COMMENT '客戶的名字',
      `Segment` varchar(15) DEFAULT NULL COMMENT '客戶所屬的市場細(xì)分',
      `Country` varchar(15) DEFAULT NULL COMMENT '訂單發(fā)貨國家的名稱',
      `City` varchar(17) DEFAULT NULL COMMENT '訂單發(fā)貨城市的名稱',
      `State` varchar(20) DEFAULT NULL COMMENT '訂單發(fā)貨州的名稱',
      `Postal Code` int(11) DEFAULT NULL COMMENT '發(fā)貨地址的郵政編碼',
      `Region` varchar(10) DEFAULT NULL COMMENT '訂單發(fā)貨的地區(qū)',
      `Product ID` varchar(15) DEFAULT NULL COMMENT '產(chǎn)品的唯一標(biāo)識符',
      `Category` varchar(15) DEFAULT NULL COMMENT '產(chǎn)品的高級別類別',
      `Sub-Category` varchar(11) DEFAULT NULL COMMENT '產(chǎn)品的子類別',
      `Product Name` varchar(128) DEFAULT NULL COMMENT '產(chǎn)品的名稱',
      `Sales` double DEFAULT NULL COMMENT '訂單折扣后的總銷售額',
      `Quantity` int(11) DEFAULT NULL COMMENT '訂購的商品數(shù)量',
      `Discount` double DEFAULT NULL COMMENT '訂單的折扣',
      `Profit` double DEFAULT NULL COMMENT '訂單產(chǎn)生的利潤'
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    錯誤示例

    CREATE TABLE `orders` (
      `Row ID` int(11) DEFAULT NULL,
      `Order ID` varchar(14) DEFAULT NULL,
      `Order Date` date DEFAULT NULL,
      `Ship Date` date DEFAULT NULL,
      `Ship Mode` varchar(15) DEFAULT NULL,
      `Customer ID` varchar(8) DEFAULT NULL,
      `Customer Name` varchar(25) DEFAULT NULL,
      `Segment` varchar(15) DEFAULT NULL,
      `Country` varchar(15) DEFAULT NULL,
      `City` varchar(17) DEFAULT NULL,
      `State` varchar(20) DEFAULT NULL,
      `Postal Code` int(11) DEFAULT NULL,
      `Region` varchar(10) DEFAULT NULL,
      `Product ID` varchar(15) DEFAULT NULL,
      `Category` varchar(15) DEFAULT NULL,
      `Sub-Category` varchar(11) DEFAULT NULL,
      `Product Name` varchar(128) DEFAULT NULL,
      `Sales` double DEFAULT NULL,
      `Quantity` int(11) DEFAULT NULL,
      `Discount` double DEFAULT NULL,
      `Profit` double DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  • 訓(xùn)練數(shù)據(jù)集問題盡量涵蓋所有實(shí)際使用字段,推薦數(shù)據(jù)集至少包含2000條數(shù)據(jù),當(dāng)模型微調(diào)效果不佳時,您可以考慮增加標(biāo)注數(shù)據(jù)量。

  • 問題描述需要盡可能豐富問法和場景。

數(shù)據(jù)格式要求

訓(xùn)練數(shù)據(jù)接受JSON格式輸入,每條數(shù)據(jù)包括如下字段:

  • "id":序號。

  • "conversations":對話內(nèi)容。包括"human"和"gpt"字段,分別表示用戶的問題和模型輸出。

  • "system":工具列表。包含該數(shù)據(jù)庫場景的DDL。

具體示例如下所示:

[
  {
    "id": 0,
    "conversations": [
      {
        "from": "human",
        "value": "返回“PVLDB”的主頁。\n"
      },
      {
        "from": "gpt",
        "value": "```sql\nSELECT homepage FROM journal WHERE name  =  \"PVLDB\"\n```\n"
      }
    ],
    "system": "你是一個sql助手,根據(jù)用戶的問題生成sql。給定以下數(shù)據(jù)庫信息:\n```sql\nCREATE TABLE IF NOT EXISTS author(\naid BIGINT COMMENT '作者ID',\nhomepage STRING COMMENT '作者主頁',\nname STRING COMMENT '作者名字',\noid BIGINT COMMENT '組織ID'\n);\nCREATE TABLE IF NOT EXISTS conference(\ncid BIGINT COMMENT '會議ID',\nhomepage STRING COMMENT '會議主頁',\nname STRING COMMENT '會議名稱'\n);\nCREATE TABLE IF NOT EXISTS domain(\ndid BIGINT COMMENT '領(lǐng)域ID',\nname STRING COMMENT '領(lǐng)域名稱'\n);\nCREATE TABLE IF NOT EXISTS domain_author(\naid BIGINT COMMENT '作者ID',\ndid BIGINT COMMENT '領(lǐng)域ID'\n);\nCREATE TABLE IF NOT EXISTS domain_conference(\ncid BIGINT COMMENT '會議ID',\ndid BIGINT COMMENT '領(lǐng)域ID'\n);\nCREATE TABLE IF NOT EXISTS journal(\nhomepage STRING COMMENT '期刊主頁',\njid BIGINT COMMENT '期刊ID',\nname STRING COMMENT '期刊名稱'\n);\nCREATE TABLE IF NOT EXISTS domain_journal(\ndid BIGINT COMMENT '領(lǐng)域ID',\njid BIGINT COMMENT '期刊ID'\n);\nCREATE TABLE IF NOT EXISTS keyword(\nkeyword STRING COMMENT '關(guān)鍵詞',\nkid BIGINT COMMENT '關(guān)鍵詞ID'\n);\nCREATE TABLE IF NOT EXISTS domain_keyword(\ndid BIGINT COMMENT '領(lǐng)域ID',\nkid BIGINT COMMENT '關(guān)鍵詞ID'\n);\nCREATE TABLE IF NOT EXISTS publication(\nabstract STRING COMMENT '摘要',\ncitation_num BIGINT COMMENT '引用數(shù)',\njid BIGINT COMMENT '期刊ID',\npid BIGINT COMMENT '論文ID',\nreference_num BIGINT COMMENT '參考論文數(shù)',\ntitle STRING COMMENT '論文標(biāo)題',\nyear BIGINT COMMENT '年份'\n);\nCREATE TABLE IF NOT EXISTS domain_publication(\ndid BIGINT COMMENT '領(lǐng)域ID',\npid BIGINT COMMENT '論文ID'\n);\nCREATE TABLE IF NOT EXISTS organization(\ncontinent STRING COMMENT '作者所在大陸',\nhomepage STRING COMMENT '組織主頁',\noid BIGINT COMMENT '組織ID'\n);\nCREATE TABLE IF NOT EXISTS publication_keyword(\npid BIGINT COMMENT '論文ID',\nkid BIGINT COMMENT '關(guān)鍵詞ID'\n);\nCREATE TABLE IF NOT EXISTS writes(\naid BIGINT COMMENT '作者ID',\npid BIGINT COMMENT '論文ID'\n);\nCREATE TABLE IF NOT EXISTS cite(\ncited BIGINT COMMENT '被引用論文ID',\nciting BIGINT COMMENT '引用論文ID'\n);\n```\n"
  }
]

批量訓(xùn)練數(shù)據(jù)生成

具體操作步驟如下:

  1. 創(chuàng)建云數(shù)據(jù)庫RDS實(shí)例和數(shù)據(jù)庫(本方案以RDS MySQL為例,您也可以使用自己的數(shù)據(jù)庫產(chǎn)品),用于生產(chǎn)SQL的可執(zhí)行性驗(yàn)證。具體操作,請參見RDS-MySQL使用流程

  2. 配置MySQL數(shù)據(jù)庫,您需要盡量完善當(dāng)前場景中的表字段說明。您可以在MySQL命令行中,執(zhí)行如下命令快速導(dǎo)入數(shù)據(jù)庫文件(example_superstore.sql)。如何連接MySQL數(shù)據(jù)庫,請參見通過命令行、客戶端連接RDS MySQL實(shí)例

    create database superstore;
    use superstore;
    source example_superstore.sql;
  3. 準(zhǔn)備示例問題文件和證據(jù)文件。

    • 示例問題文件(few_shot_example.json):包含querycolumns兩個字段。其中:

      • query:代表與當(dāng)前數(shù)據(jù)庫相關(guān)的示例問題。

      • columns:代表與該問題相關(guān)的列名。

      準(zhǔn)備3-5個示例問題,列名個數(shù)從易到難在1-3個之間,示例問題文件示例內(nèi)容如下所示:

      [
          {
              "query": "總銷售額是多少",
              "columns": [
                  "Sales"
              ]
          },
          {
              "query": "不同城市的銷售額是多少",
              "columns": [
                  "City",
                  "Sales"
              ]
          },
          {
              "query": "2016年每個月總銷售額是多少",
              "columns": [
                  "Order Date",
                  "Sales"
              ]
          },
          {
              "query": "2016年每個月總銷售額是多少,按發(fā)貨時間算, 并按地區(qū)統(tǒng)計(jì)",
              "columns": [
                  "Profit",
                  "Ship Date",
                  "Region"
              ]
          }
      ]
    • 證據(jù)文件(evidence_example.json):包含需要在生成數(shù)據(jù)prompt中進(jìn)行描述的列名,其中包含如下三個字段:

      • table:列名所在的表名。

      • column:代表列名。

      • type:代表列名的類型。對于不同的type類型,在數(shù)據(jù)增廣prompt中會產(chǎn)生額外描述。type類型如下表所示:

        type

        說明

        data_column

        代表時間類型,指定后會產(chǎn)生該示例描述:這一列代表日期,日期的范圍是XXX到XXX。

        enum_column

        代表需要進(jìn)行枚舉的類型,指定后會產(chǎn)生該示例描述:這一列的值是枚舉值,可以使用的枚舉值為[XXX, XXX, XXX]。

        skip_column

        表示與業(yè)務(wù)無關(guān)的列名,指定后不會生成與該列相關(guān)的問題。

      證據(jù)文件示例內(nèi)容如下所示:

      [
          {
              "table": "orders",
              "type": "date_column",
              "column": "Order Date"
          },
          {
              "table": "orders",
              "type": "date_column",
              "column": "Ship Date"
          },
          {
              "table": "orders",
              "type": "enum_column",
              "column": "Ship Mode"
          },
          {
              "table": "orders",
              "type": "enum_column",
              "column": "Segment"
          },
          {
              "table": "orders",
              "type": "enum_column",
              "column": "Region"
          },
          {
              "table": "orders",
              "type": "enum_column",
              "column": "Country"
          },
          {
              "table": "orders",
              "type": "enum_column",
              "column": "Sub-Category"
          },
          {
              "table": "orders",
              "type": "enum_column",
              "column": "Category"
          },
          {
              "table": "orders",
              "type": "skip_column",
              "column": "Row ID"
          }
      ]
  4. 將示例問題文件和證據(jù)文件上傳到已創(chuàng)建的OSS Bucket存儲空間,詳情請參見步驟三:上傳文件。文件上傳的示例路徑如下:

    • 示例問題文件:oss://example-bucket/simplebi/few_shot_example.json

    • 證據(jù)文件:oss://example-bucket/simplebi/evidence_example.json

  5. 使用PAI-DLC批量生產(chǎn)數(shù)據(jù)。

    創(chuàng)建分布式訓(xùn)練(DLC)任務(wù),并配置以下關(guān)鍵參數(shù),其他參數(shù)配置說明,請參見創(chuàng)建訓(xùn)練任務(wù)

    參數(shù)

    描述

    基本信息

    任務(wù)名稱

    自定義配置任務(wù)名稱。

    環(huán)境信息

    節(jié)點(diǎn)鏡像

    單擊鏡像地址,并在文本框中輸入鏡像dsw-registry-vpc.<region>.cr.aliyuncs.com/pai-training-algorithm/llm_deepspeed_llamafactory:v0.0.3。其中<region>需要根據(jù)實(shí)際地域進(jìn)行調(diào)整,例如華北6(烏蘭察布)配置為cn-wulanchabu。

    掛載配置

    單擊添加,將示例問題文件和證據(jù)文件所在目錄掛載到訓(xùn)練容器中。掛載類型選擇對象存儲(OSS),并配置以下參數(shù):

    • OSS:選擇示例問題文件和證據(jù)文件所在的OSS路徑。例如oss://example-bucket/。

    • 掛載路徑:配置為/mnt/data。

    啟動命令

    在代碼編輯框中配置如下啟動命令:

    python -m simplebi.data_augmentation.data_generate \
    --generate_number 10000 \
    --processes_number 40 \
    --fewshot_query_filepath /mnt/data/simplebi/few_shot_example.json \
    --evidence_filepath /mnt/data/simplebi/evidence_example.json \
    --output_filepath /mnt/data/simplebi/qwen2_72b_1000.json \
    --host rm-******o.mysql.rds.aliyuncs.com \
    --port 3306 \
    --user Simple**** \
    --database supers**** \
    --passwd SimpleB**** \
    --dtype bfloat16 \
    --max_model_len 8192 \
    --tensor_parallel_size 8 \
    --query_temperature 0.8 \
    --sql_temperature 0.2 \
    --max_tokens 1024

    參數(shù)配置說明,請參見啟動參數(shù)說明

    資源信息

    資源類型

    選擇靈駿智算

    資源來源

    選擇競價資源

    任務(wù)資源

    單擊image選擇資源規(guī)格:ml.gu7xf.8xlarge-gu108或ml.gu8xf.8xlarge-gu108,并配置最高出價。

    專有網(wǎng)絡(luò)配置

    專有網(wǎng)絡(luò)配置(ID)

    選擇已配置公網(wǎng)訪問的VPC網(wǎng)絡(luò)。如何配置公網(wǎng)訪問,請參見NAT網(wǎng)關(guān)

    交換機(jī)

    安全組

    選擇安全組。

    啟動參數(shù)說明

    參數(shù)

    描述

    generate_number

    生成的問題和SQL對條數(shù)。

    processes_number

    同時進(jìn)行數(shù)據(jù)生成進(jìn)程數(shù)。

    fewshot_query_filepath

    示例問題文件掛載到容器中的路徑。例如:/mnt/data/simplebi/few_shot_example.json。

    evidence_filepath

    證據(jù)文件掛載到容器中的路徑。例如:/mnt/data/simplebi/evidence_example.json

    output_filepath

    生成數(shù)據(jù)文件路徑,同時會生成_llamafactory后綴的JSON文件,該文件可直接用于后續(xù)訓(xùn)練。

    host

    RDS數(shù)據(jù)庫的公網(wǎng)地址。如何獲取,請參見通過客戶端、命令行連接RDS MySQL實(shí)例

    port

    RDS數(shù)據(jù)庫的連接端口。如何獲取,請參見通過客戶端、命令行連接RDS MySQL實(shí)例

    user

    RDS數(shù)據(jù)庫的連接用戶名。如何獲取,請參見通過客戶端、命令行連接RDS MySQL實(shí)例

    database

    RDS數(shù)據(jù)庫的連接數(shù)據(jù)庫名稱。

    passwd

    RDS數(shù)據(jù)庫的連接密碼。如何獲取,請參見通過客戶端、命令行連接RDS MySQL實(shí)例

    tensor_parallel_size

    模型張量并行大小。

    query_temperature

    生成問題時使用的采樣溫度。

    sql_temperature

    生成SQL時使用的采樣溫度。

    max_tokens

    最大生成長度。

訓(xùn)練模型

快速開始匯集了優(yōu)秀的國內(nèi)外AI開源社區(qū)預(yù)訓(xùn)練模型。您可以在快速開始>Model Gallery中,實(shí)現(xiàn)從訓(xùn)練到部署再至推理的完整流程,無需編寫代碼,極大簡化了模型的開發(fā)過程。

本方案以CodeQwen1.5-7b-NL2SQL模型為例,為您介紹如何使用已準(zhǔn)備好的訓(xùn)練數(shù)據(jù),在快速開始中進(jìn)行模型訓(xùn)練。具體操作步驟如下:

  1. 進(jìn)入Model Gallery頁面。

    1. 登錄PAI控制臺

    2. 在頂部左上角根據(jù)實(shí)際情況選擇地域。

    3. 在左側(cè)導(dǎo)航欄選擇工作空間列表,單擊指定工作空間名稱,進(jìn)入對應(yīng)工作空間內(nèi)。

    4. 在左側(cè)導(dǎo)航欄選擇快速開始 > Model Gallery

  2. 在Model Gallery頁面右側(cè)的模型列表中,搜索并單擊CodeQwen1.5-7b-NL2SQL模型卡片,進(jìn)入模型詳情頁面。

  3. 在模型詳情頁面,單擊右上角的微調(diào)訓(xùn)練,并在微調(diào)訓(xùn)練配置面板中,配置以下關(guān)鍵參數(shù)。

    參數(shù)

    描述

    訓(xùn)練方式

    支持以下兩種訓(xùn)練方式,具體說明如下:

    • QLoRA:QLoRA訓(xùn)練屬于高效訓(xùn)練的一種,會在固定并量化模型本身參數(shù)的基礎(chǔ)上,僅對自注意力權(quán)重矩陣進(jìn)行低秩分解,并更新低秩矩陣參數(shù)。該訓(xùn)練方法訓(xùn)練時間短,但效果可能會略差于LoRA。

    • LoRA:LoRA訓(xùn)練屬于高效訓(xùn)練的一種,會在固定模型本身參數(shù)的基礎(chǔ)上,僅對自注意力權(quán)重矩陣進(jìn)行低秩分解,并更新低秩矩陣參數(shù)。

    數(shù)據(jù)集配置

    訓(xùn)練數(shù)據(jù)集

    參照以下操作步驟,選擇已準(zhǔn)備好的訓(xùn)練數(shù)據(jù)集。

    1. 在下拉列表中選擇OSS文件或目錄

    2. 單擊image按鈕,選擇已創(chuàng)建的OSS目錄。

    3. 選擇OSS文件對話框中,單擊上傳文件,拖拽上傳已準(zhǔn)備好的訓(xùn)練數(shù)據(jù)集文件(示例文件:qwen2_72b_10000_llamafactory.json),并單擊確定

      說明

      如果出現(xiàn)“數(shù)據(jù)解析失敗,請檢查文件內(nèi)容格式”字樣,請忽略,不影響您執(zhí)行后續(xù)操作。

    訓(xùn)練輸出配置

    模型名稱

    注冊到AI資產(chǎn)管理>模型中的模型名稱。按照控制臺界面提示自定義配置。

    模型輸出路徑

    選擇OSS目錄,用來存放訓(xùn)練輸出的配置文件。

    計(jì)算資源配置

    資源組類型

    選擇公共資源組(按量付費(fèi))

    任務(wù)資源

    系統(tǒng)已默認(rèn)配置了資源規(guī)格,您也可以根據(jù)需要進(jìn)行修改:

    • 當(dāng)訓(xùn)練方式選擇QLoRA時:最低使用V100/P100/T4(16 GB顯存)及以上卡型。

    • 當(dāng)訓(xùn)練方式選擇LoRA時:最低使用V100(32 GB顯存)/A10及以上卡型。

    超參數(shù)配置

    訓(xùn)練算法支持的超參信息,請參見表1.全量超參數(shù)說明。針對不同的訓(xùn)練方式,關(guān)鍵超參數(shù)推薦配置,請參見表2.超參數(shù)推薦配置

    表1.全量超參數(shù)說明

    超參數(shù)

    類型

    是否必選

    含義

    默認(rèn)值

    learning_rate

    FLOAT

    學(xué)習(xí)率,用于控制模型權(quán)重調(diào)整幅度。

    3e-4

    num_train_epochs

    INT

    訓(xùn)練數(shù)據(jù)集被重復(fù)使用的次數(shù)。

    1

    per_device_train_batch_size

    INT

    每個GPU在一次訓(xùn)練迭代中處理的樣本數(shù)量。較大的批次大小可以提高效率,也會增加顯存的需求。

    1

    seq_length

    INT

    序列長度,指模型在一次訓(xùn)練中處理的輸入數(shù)據(jù)的長度。

    1024

    lora_dim

    INT

    LoRA維度,當(dāng)lora_dim>0時,使用LoRA或QLoRA輕量化訓(xùn)練。

    64

    lora_alpha

    INT

    LoRA權(quán)重,當(dāng)lora_dim>0時,使用LoRA或QLoRA輕量化訓(xùn)練,該參數(shù)生效。

    32

    load_in_4bit

    BOOL

    模型是否以4 bit加載。

    當(dāng)lora_dim>0、load_in_4bit為true且load_in_8bit為false時,使用4 bit QLoRA輕量化訓(xùn)練。

    true

    load_in_8bit

    BOOL

    模型是否以8比特加載。

    當(dāng)lora_dim>0、load_in_4bit為false且load_in_8bit為true時,使用8 bit QLoRA輕量化訓(xùn)練。

    false

    gradient_accumulation_steps

    INT

    梯度累積步驟數(shù)。

    8

    template

    STRING

    模型使用的prompt拼接模板,該示例使用qwen模板。

    qwen

    表2.超參數(shù)推薦配置

    參數(shù)

    全參數(shù)微調(diào)

    LoRA/QLoRA

    learning_rate

    5e-6、5e-5

    3e-4

    全局批次大小

    128

    128

    seq_length

    1024

    1024

    num_train_epochs

    2、3

    2、3

    lora_dim

    0

    32、64

    lora_alpha

    0

    32

    load_in_4bit

    False

    True/False

    load_in_8bit

    False

    True/False

  4. 參數(shù)配置完成后,單擊訓(xùn)練,然后在計(jì)費(fèi)提醒對話框中,單擊確定

    系統(tǒng)自動跳轉(zhuǎn)到訓(xùn)練任務(wù)詳情頁面,訓(xùn)練任務(wù)啟動成功,您可以在該頁面查看訓(xùn)練任務(wù)狀態(tài)和任務(wù)日志。

部署及調(diào)用模型服務(wù)

部署模型服務(wù)

模型訓(xùn)練成功后,即可部署模型服務(wù)。PAI預(yù)置了模型的部署配置信息,您僅需提供推理服務(wù)的名稱以及部署配置使用的資源信息,即可將訓(xùn)練獲得的模型部署到模型在線服務(wù)(EAS)平臺。具體操作步驟如下:

  1. 任務(wù)詳情頁面,單擊右上角的部署

  2. 部署配置面板中,系統(tǒng)已默認(rèn)配置了模型服務(wù)信息和資源部署信息,您也可以根據(jù)需要進(jìn)行修改,參數(shù)配置完成后,單擊部署

  3. 計(jì)費(fèi)提醒對話框中,單擊確定

    系統(tǒng)將自動跳轉(zhuǎn)到部署任務(wù)頁面,當(dāng)狀態(tài)運(yùn)行中時,表示服務(wù)部署成功。

調(diào)用模型服務(wù)

當(dāng)模型服務(wù)部署成功后,您可以按照以下操作步驟調(diào)用模型服務(wù):

  1. 查詢服務(wù)訪問地址和Token。

    1. 部署任務(wù)頁面,單擊服務(wù)名稱,進(jìn)入服務(wù)詳情頁面。

    2. 基本信息區(qū)域,單擊查看調(diào)用信息

    3. 調(diào)用信息對話框的公網(wǎng)地址調(diào)用頁簽,查看訪問地址Tokenimage

  2. 本方案是API方式的模型服務(wù)部署,您可以在終端中執(zhí)行如下Python代碼,使用OpenAPI的SDK調(diào)用模型服務(wù)。

    from openai import OpenAI
    
    client = OpenAI(
        base_url="<eas_service_path>/v1",
        api_key="<eas_service_token>",
    )
    
    chat_completion = client.chat.completions.create(
        model="/model_dir",
        messages=[
            {"role": "system", "content": "你是一個sql助手,根據(jù)用戶的問題生成sql,參考如下ddl:\nCREATE TABLE `orders` (\n  `Row ID` int DEFAULT NULL COMMENT '行的唯一標(biāo)識符',\n  `Order ID` varchar(14) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '訂單的唯一標(biāo)識符',\n  `Order Date` date DEFAULT NULL COMMENT '下單日期',\n  `Ship Date` date DEFAULT NULL COMMENT '發(fā)貨日期',\n  `Ship Mode` varchar(15) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '發(fā)貨方式',\n  `Customer ID` varchar(8) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '客戶的唯一標(biāo)識符',\n  `Customer Name` varchar(25) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '客戶的名字',\n  `Segment` varchar(15) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '客戶所屬的市場細(xì)分',\n  `Country` varchar(15) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '客戶所在國家的名稱',\n  `City` varchar(17) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '客戶所在城市的名稱',\n  `State` varchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '客戶所在州的名稱',\n  `Postal Code` int DEFAULT NULL COMMENT '客戶地址的郵政編碼',\n  `Region` varchar(10) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '客戶所在的地區(qū)',\n  `Product ID` varchar(15) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '產(chǎn)品的唯一標(biāo)識符',\n  `Category` varchar(15) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '產(chǎn)品的高級別類別',\n  `Sub-Category` varchar(11) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '產(chǎn)品的子類別',\n  `Product Name` varchar(128) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '產(chǎn)品的名稱',\n  `Sales` double DEFAULT NULL COMMENT '訂單折扣后的總銷售額',\n  `Quantity` int DEFAULT NULL COMMENT '訂購的商品數(shù)量',\n  `Discount` double DEFAULT NULL COMMENT '訂單的折扣',\n  `Profit` double DEFAULT NULL COMMENT '訂單產(chǎn)生的利潤'\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\nCREATE TABLE `people` (\n  `Person` varchar(20) DEFAULT NULL,\n  `Region` varchar(10) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\nCREATE TABLE `returns` (\n  `Returned` varchar(3) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '訂單是否被退單',\n  `Order ID` varchar(15) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '訂單的唯一標(biāo)識符'\n) ENGINE=InnoDB DEFAULT CHARSET=latin1,回答sql查詢問題"},
            {"role": "user", "content": "在2016年,每個月各類產(chǎn)品的訂單數(shù)量是多少?"}
            ],
    )
    
    print(chat_completion.choices)

    其中:

    • <eas_service_path>:替換為上述步驟已查詢的服務(wù)訪問地址。

    • <eas_service_token>:替換為上述步驟已查詢的服務(wù)Token。

    調(diào)用成功后,返回結(jié)果示例如下,您的結(jié)果以實(shí)際為準(zhǔn):

    [Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content="在2016年,我們可以通過以下SQL查詢獲取每個月各類產(chǎn)品的訂單數(shù)量:\n\n```sql\nSELECT \n    DATE_FORMAT(`Order Date`, '%Y-%m') AS YearMonth,\n    `Category`,\n    COUNT(*) AS OrderCount\nFROM \n    orders\nWHERE \n    YEAR(`Order Date`) = 2016\nGROUP BY \n    YearMonth,\n    `Category`;\n```\n\n這個查詢首先通過DATE_FORMAT函數(shù)將訂單日期格式化為年月(YYYY-MM),然后按照年月和類別進(jìn)行分組,最后計(jì)算每個月各類產(chǎn)品的訂單數(shù)量。", role='assistant', function_call=None, tool_calls=None), stop_reason=None)]
  3. 服務(wù)調(diào)用成功后,您可在終端中執(zhí)行如下Python代碼,基于RDS-MySQL驗(yàn)證模型生成SQL。

    import re
    import pymysql
    
    
    def parse(text):
        pattern = r"```sql\n(.*?)\n```"
        matches = re.findall(pattern, text, re.DOTALL)
        if matches:
            sql_content = matches[0].strip()
            if not sql_content.endswith(";"):
                sql_content += ";"
            return sql_content
        else:
            if not text.endswith(";"):
                text += ";"
            return text
    
    
    def excute_sql(input_text: str) -> tuple:
        sql = parse(input_text)
        cursor = db.cursor()
        try:
            cursor.execute(sql)
            col = cursor.description
            sql_data = cursor.fetchall()
            return sql_data
        except Exception as e:
            return "error"
    
    
    db = pymysql.connect(
        host="數(shù)據(jù)庫連接",
        user="數(shù)據(jù)庫用戶名",
        passwd="數(shù)據(jù)庫密碼",
        port=3306,
        db="數(shù)據(jù)庫名稱",
    )
    
    print(
        excute_sql(
            "填寫模型輸出文本"
        )
    )
    

    其中關(guān)鍵配置說明如下:

    關(guān)鍵配置

    描述

    host

    配置為RDS數(shù)據(jù)庫的公網(wǎng)地址。

    user

    配置為RDS數(shù)據(jù)庫的連接用戶名。

    passwd

    配置為RDS數(shù)據(jù)庫的連接密碼。

    port

    配置為RDS數(shù)據(jù)庫的連接端口。

    db

    配置為RDS數(shù)據(jù)庫的連接數(shù)據(jù)庫名稱。

    excute_sql

    將文本內(nèi)容配置為步驟2調(diào)用服務(wù)返回結(jié)果中的content字段內(nèi)容。