透過全新的 Olive CLI 普及 AI 模型最佳化

作者

Jambay KinleyHitesh ShahXiaoyu ZhangDevang PatelSam Kemp

2024年11月11日

👋 簡介

Build 2023大會上,微軟宣佈推出 Olive (ONNX Live):一個先進的模型最佳化工具包,旨在簡化 AI 模型為 ONNX Runtime 部署進行最佳化的過程。如下圖所示,Olive 可以接收來自 PyTorch 或 Hugging Face 等框架的模型,並輸出針對特定部署目標定製的最佳化 ONNX 模型。

Olive workflow. Olive 高階工作流程。這些硬體目標可以包括高通、AMD、英偉達和英特爾等主要硬體供應商提供的各種 AI 加速器(GPU、CPU)

Olive 透過一系列稱為“通道(passes)”的模型最佳化任務,以結構化的工作流程執行。這些通道可以包括模型壓縮、圖捕獲、量化和圖最佳化。每個通道都有可調整的引數,可以進行調優以實現準確率和延遲等最佳指標,這些指標由各自的評估器進行評估。該工具利用搜索策略,採用演算法自動調優單個通道或通道組,確保部署目標的最佳效能。

雖然 Olive 中使用的工作流程正規化非常靈活,但對於剛接觸模型最佳化流程的 AI 開發者來說,學習曲線可能具有挑戰性。為了使模型最佳化更易於上手,我們為常見場景精選了一系列 Olive 工作流程,並將它們以一個簡單命令的形式在**適用於 Olive 的全新易用 CLI** 中公開。

Olive Commands. 新的 Olive CLI 命令與執行的關聯 Olive 工作流程的對映。

在本部落格中,我們將向您展示如何使用 Olive CLI 為 ONNX Runtime 準備模型。

🚀 Olive CLI 入門

首先,使用 pip 安裝 Olive

pip install olive-ai[cpu,finetune]

🪄 自動最佳化器

安裝 Olive 後,請嘗試自動最佳化器(olive auto-opt)。僅需一個命令,Olive 將會:

  1. 從 Hugging Face 下載模型
  2. 將模型結構捕獲為 ONNX 圖,並將權重轉換為 ONNX 格式。
  3. 最佳化 ONNX 圖(例如,融合)
  4. 將模型權重量化為 int4

在 CPU 裝置上執行 Llama-3.2-1B-Instruct 模型的自動最佳化器命令是:

olive auto-opt \
    --model_name_or_path meta-llama/Llama-3.2-1B-Instruct \
    --trust_remote_code \ 
    --output_path optimized-model \
    --device cpu \
    --provider CPUExecutionProvider \
    --precision int4 \
    --use_model_builder True \
    --log_level 1

提示:如果您想將目標設定為:

  • CUDA GPU,請將 --device 更新為 gpu,並將 --provider 更新為 CUDAExecutionProvider
  • Windows DirectML,請將 --device 更新為 gpu,並將 --provider 更新為 DmlExecutionProvider

Olive 將應用特定於裝置和提供程式的最佳化。

使用 auto-opt 命令,您可以將輸入模型更改為 Hugging Face 上可用的模型(例如,HuggingFaceTB/SmolLM-360M-Instruct),或者位於本地磁碟上的模型。需要注意的是,olive auto-opt 中的 --trust_remote_code 引數僅適用於 Hugging Face 中需要您的機器執行程式碼的自定義模型——欲瞭解更多詳情,請閱讀 Hugging Face 關於 trust_remote_code 的文件。Olive 將自動完成轉換(為 ONNX)、最佳化圖和量化權重等過程。

🧪 試驗不同的量化演算法

Olive CLI 允許您試驗許多不同的量化演算法——例如 AWQ、GPTQ 和 QuaRot——以及這些演算法的不同實現。例如,要使用啟用感知量化 (AWQ) 量化 Llama-3.2-1B-Instruct:

注意:您的計算機需要安裝 CUDA GPU 裝置和相關的驅動程式才能執行 AWQ、GPTQ 和 QuaRot 量化。此外,您應該使用以下命令安裝 AutoAWQ 包:

pip install autoawq

olive quantize \
    --model_name_or_path meta-llama/Llama-3.2-1B-Instruct \
    --algorithm awq \
    --output_path quantized-model \
    --log_level 1

使用 AWQ 方法時,量化命令將輸出一個 PyTorch 模型,如果您打算在 ONNX Runtime 上使用該模型,可以使用以下命令將其轉換為 ONNX:

olive capture-onnx-graph \
    --model_name_or_path quantized-model/model \
    --use_ort_genai True \
    --log_level 1 \

🎚️ 微調

Olive CLI 還提供了使用 LoRA 或 QLoRA 根據我們自己的資料針對特定任務微調 AI 模型的工具。以下示例將微調 Llama-3.2-1B-Instruct 用於短語分類(給定一個英文短語,它將輸出該短語的類別,例如快樂/悲傷/恐懼/驚喜)。

olive finetune \
    --model_name_or_path meta-llama/Llama-3.2-1B-Instruct \
    --trust_remote_code \
    --output_path models/llama3.2/ft \
    --data_name xxyyzzz/phrase_classification \
    --text_template "<|start_header_id|>user<|end_header_id|>\n{phrase}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n{tone}" \
    --method qlora \
    --max_steps 30 \
    --log_level 1 \

微調命令將輸出一個 Hugging Face PEFT 介面卡,您可以使用以下命令為 ONNX Runtime 準備它:

# Step 1 - capture the ONNX graph of the base model and adapter
olive capture-onnx-graph \
    --model_name_or_path models/llama3.2/ft/model \
    --adapter_path models/llama3.2/ft/adapter \
    --use_ort_genai \
    --output_path models/llama3.2/onnx \
    --log_level 1

# Step 2 - Extract adapter weights from ONNX model and store in separate file for ORT
 olive generate-adapter \
    --model_name_or_path models/llama3.2/onnx \
    --output_path adapter-onnx \
    --log_level 1       

🤝 使用 ONNX Runtime 的 Generate API 推斷您的最佳化 AI 模型

以下 Python 程式碼建立了一個簡單的基於控制檯的聊天介面,用於使用 ONNX Runtime 的 Generate API 推斷您的最佳化模型。

提示:其他語言繫結——例如 C#、C/C++、Java——更多即將推出。有關最新列表,請訪問ONNX Runtime 的 Generate API GitHub 頁面

import onnxruntime_genai as og
import numpy as np
import os

model_folder = "optimized-model/model"

# Load the base model and tokenizer
model = og.Model(model_folder)
tokenizer = og.Tokenizer(model)
tokenizer_stream = tokenizer.create_stream()

# Set the max length to something sensible by default,
# since otherwise it will be set to the entire context length
search_options = {}
search_options['max_length'] = 200
search_options['past_present_share_buffer'] = False

chat_template = """<|begin_of_text|><|start_header_id|>system<|end_header_id|>

You are a helpful assistant<|eot_id|><|start_header_id|>user<|end_header_id|>

{input}<|eot_id|><|start_header_id|>assistant<|end_header_id|>
""" 

text = input("Input: ")

# Keep asking for input phrases
while text != "exit":
    if not text:
        print("Error, input cannot be empty")
        exit

    # generate prompt (prompt template + input)
    prompt = f'{chat_template.format(input=text)}'

    # encode the prompt using the tokenizer
    input_tokens = tokenizer.encode(prompt)

    params = og.GeneratorParams(model)
    params.set_search_options(**search_options)
    params.input_ids = input_tokens
    generator = og.Generator(model, params)

    print("Output: ", end='', flush=True)
    # stream the output
    try:
        while not generator.is_done():
            generator.compute_logits()
            generator.generate_next_token()

            new_token = generator.get_next_tokens()[0]
            print(tokenizer_stream.decode(new_token), end='', flush=True)
    except KeyboardInterrupt:
        print("  --control+c pressed, aborting generation--")

    print()
    text = input("Input: ")

結論

在本部落格中,我們展示瞭如何使用新的 Olive CLI 為 ONNX Runtime 構建模型,然後使用 ONNX Runtime 的 Generate API 推斷這些模型。Olive CLI 命令會為您執行精選的 Olive 工作流程,這意味著您將繼續獲得以下所有優勢:

  • 減少透過試錯手動試驗不同圖最佳化、壓縮和量化技術所帶來的挫敗感和時間消耗。定義您的質量和效能約束,讓 Olive 自動為您找到最佳模型。
  • 40多個內建模型最佳化元件,涵蓋量化、壓縮、圖最佳化和微調等領域的尖端技術。
  • 支援建立模型,使其能夠使用Multi LoRA 正規化進行服務。
  • Hugging FaceAzure AI 整合。
  • 內建快取機制,可節省成本並增強團隊協作。正如我們之前在一篇部落格文章中分享的,Olive 還支援共享快取