기업이 자체 산업 수직 모델을 만들고자 한다면 데이터, 미세 조정, 배포부터 시작해야 합니다. 이전 내용에서는 Microsoft Olive에 대해 소개했으며, 이제 E2E 작업을 기반으로 더 자세한 설명을 완료하겠습니다.
프로젝트를 구조화하기 위해 VS Code의 AI Toolkit으로 생성된 프로젝트를 참조할 수 있습니다. 여기에는 데이터, 모델, 미세 조정 형식, 추론 등이 포함됩니다. 예를 들어:
|-- Your Phi-3-mini E2E Proj
|-- datasets
|-- fine-tuning
|-- inferences
|-- model-cache
|-- gen-model
|-- setup
-
datasets
데이터는 csv, json 등의 형식으로 저장될 수 있습니다. 이 예에서는 내보낸 json 데이터를 사용합니다. dataset
Note 데이터가 이미 Azure ML에 업로드된 경우 여기에서 관련 설정을 무시할 수 있습니다. (로컬인 경우 데이터를 여기에서 업로드할 수 있습니다)
-
fine-tuning
QLoRA와 LoRA 알고리즘 및 관련 매개변수를 지정합니다.
-
inferences
추론은 미세 조정 후의 모델입니다. 이는 미세 조정된 Adapter 레이어에 대한 참조, 미세 조정 후 Adapter와 통합된 모델에 대한 참조, 또는 양자화된 ONNX Runtime 모델일 수 있습니다.
-
model-cache
Hugging face CLI를 통해 다운로드한 모델입니다. 여기서는 Phi-3-Mini 모델입니다. (Azure ML을 사용하는 경우 이 내용을 무시할 수 있습니다. 로컬에서 작업하려면 다음 스크립트를 실행하여 phi-3 모델을 얻으세요)
huggingface-cli login
# Hugging Face Portal에서 키를 입력하세요
huggingface-cli download microsoft/Phi-3-mini-4k-instruct --local-dir Your Phi-3-mini location
-
gen-model
작업 후 저장된 모델로, 미세 조정된 Adapter 모델, 통합된 미세 조정 Adapter 모델, ONNX Runtime에서 실행되는 양자화된 모델이 포함됩니다.
-
setup
필요한 설치 환경을 설정합니다. Olive Env를 설정하려면 이를 실행하세요.
pip install -r requirements.txt
Microsoft Olive의 설정에 대해 알고 싶다면 Fine Tuning with Microsoft Olive를 방문하세요.
Note 최신 상태를 유지하려면 Microsoft Olive를 다음을 사용하여 설치하세요.
pip install git+https://github.com/microsoft/Olive
LoRA
이 예제는 클라우드 컴퓨팅과 클라우드 데이터를 사용하며, fine-tuning 폴더에 olive.config를 추가합니다.
{
"azureml_client": {
"subscription_id": "Your Azure Subscription ID",
"resource_group": "Your Azure Resource Group",
"workspace_name": "Your Azure ML Worksapce",
"keyvault_name": "Your Azure Key Valuts"
},
"input_model":{
"type": "PyTorchModel",
"config": {
"hf_config": {
"model_name": "microsoft/Phi-3-mini-4k-instruct",
"task": "text-generation",
"from_pretrained_args": {
"trust_remote_code": true
}
}
}
},
"systems": {
"aml": {
"type": "AzureML",
"config": {
"accelerators": [
{
"device": "gpu",
"execution_providers": [
"CUDAExecutionProvider"
]
}
],
"hf_token": true,
"aml_compute": "Your Azure ML Compute Cluster",
"aml_docker_config": {
"base_image": "mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.8-cudnn8-ubuntu22.04",
"conda_file_path": "conda.yaml"
}
}
},
"azure_arc": {
"type": "AzureML",
"config": {
"accelerators": [
{
"device": "gpu",
"execution_providers": [
"CUDAExecutionProvider"
]
}
],
"aml_compute": "Your Azure ML Compute",
"aml_docker_config": {
"base_image": "mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.8-cudnn8-ubuntu22.04",
"conda_file_path": "conda.yaml"
}
}
}
},
"data_configs": [
{
"name": "dataset_default_train",
"type": "HuggingfaceContainer",
"load_dataset_config": {
"params": {
"data_name": "json",
"data_files": {
"type": "azureml_datastore",
"config": {
"azureml_client": {
"subscription_id": "Your Azure Subscrition ID",
"resource_group": "Your Azure Resource Group",
"workspace_name": "Your Azure ML Workspaces name"
},
"datastore_name": "workspaceblobstore",
"relative_path": "Your train_data.json Azure ML Location"
}
},
"split": "train"
}
},
"pre_process_data_config": {
"params": {
"dataset_type": "corpus",
"text_cols": [
"Question",
"Best Answer"
],
"text_template": "<|user|>\n{Question}<|end|>\n<|assistant|>\n{Best Answer}\n<|end|>",
"corpus_strategy": "join",
"source_max_len": 2048,
"pad_to_max_len": false,
"use_attention_mask": false
}
}
}
],
"passes": {
"lora": {
"type": "LoRA",
"config": {
"target_modules": [
"o_proj",
"qkv_proj"
],
"double_quant": true,
"lora_r": 64,
"lora_alpha": 64,
"lora_dropout": 0.1,
"train_data_config": "dataset_default_train",
"eval_dataset_size": 0.1,
"training_args": {
"seed": 0,
"data_seed": 42,
"per_device_train_batch_size": 1,
"per_device_eval_batch_size": 1,
"gradient_accumulation_steps": 4,
"gradient_checkpointing": false,
"learning_rate": 0.0001,
"num_train_epochs": 1000,
"max_steps": 100,
"logging_steps": 100,
"evaluation_strategy": "steps",
"eval_steps": 187,
"group_by_length": true,
"adam_beta2": 0.999,
"max_grad_norm": 0.3
}
}
},
"merge_adapter_weights": {
"type": "MergeAdapterWeights"
},
"builder": {
"type": "ModelBuilder",
"config": {
"precision": "int4"
}
}
},
"engine": {
"log_severity_level": 0,
"host": "aml",
"target": "aml",
"search_strategy": false,
"cache_dir": "cache",
"output_dir" : "../model-cache/models/phi3-finetuned"
}
}
QLoRA
{
"azureml_client": {
"subscription_id": "Your Azure Subscription ID",
"resource_group": "Your Azure Resource Group",
"workspace_name": "Your Azure ML Worksapce",
"keyvault_name": "Your Azure Key Valuts"
},
"input_model":{
"type": "PyTorchModel",
"config": {
"hf_config": {
"model_name": "microsoft/Phi-3-mini-4k-instruct",
"task": "text-generation",
"from_pretrained_args": {
"trust_remote_code": true
}
}
}
},
"systems": {
"aml": {
"type": "AzureML",
"config": {
"accelerators": [
{
"device": "gpu",
"execution_providers": [
"CUDAExecutionProvider"
]
}
],
"hf_token": true,
"aml_compute": "Your Azure ML Compute Cluster",
"aml_docker_config": {
"base_image": "mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.8-cudnn8-ubuntu22.04",
"conda_file_path": "conda.yaml"
}
}
},
"azure_arc": {
"type": "AzureML",
"config": {
"accelerators": [
{
"device": "gpu",
"execution_providers": [
"CUDAExecutionProvider"
]
}
],
"aml_compute": "Your Azure ML Compute",
"aml_docker_config": {
"base_image": "mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.8-cudnn8-ubuntu22.04",
"conda_file_path": "conda.yaml"
}
}
}
},
"data_configs": [
{
"name": "dataset_default_train",
"type": "HuggingfaceContainer",
"load_dataset_config": {
"params": {
"data_name": "json",
"data_files": {
"type": "azureml_datastore",
"config": {
"azureml_client": {
"subscription_id": "Your Azure Subscrition ID",
"resource_group": "Your Azure Resource Group",
"workspace_name": "Your Azure ML Workspaces name"
},
"datastore_name": "workspaceblobstore",
"relative_path": "Your train_data.json Azure ML Location"
}
},
"split": "train"
}
},
"pre_process_data_config": {
"params": {
"dataset_type": "corpus",
"text_cols": [
"Question",
"Best Answer"
],
"text_template": "<|user|>\n{Question}<|end|>\n<|assistant|>\n{Best Answer}\n<|end|>",
"corpus_strategy": "join",
"source_max_len": 2048,
"pad_to_max_len": false,
"use_attention_mask": false
}
}
}
],
"passes": {
"qlora": {
"type": "QLoRA",
"config": {
"compute_dtype": "bfloat16",
"quant_type": "nf4",
"double_quant": true,
"lora_r": 64,
"lora_alpha": 64,
"lora_dropout": 0.1,
"train_data_config": "dataset_default_train",
"eval_dataset_size": 0.3,
"training_args": {
"seed": 0,
"data_seed": 42,
"per_device_train_batch_size": 1,
"per_device_eval_batch_size": 1,
"gradient_accumulation_steps": 4,
"gradient_checkpointing": false,
"learning_rate": 0.0001,
"num_train_epochs": 3,
"max_steps": 10,
"logging_steps": 10,
"evaluation_strategy": "steps",
"eval_steps": 187,
"group_by_length": true,
"adam_beta2": 0.999,
"max_grad_norm": 0.3
}
}
},
"merge_adapter_weights": {
"type": "MergeAdapterWeights"
}
},
"engine": {
"log_severity_level": 0,
"host": "aml",
"target": "aml",
"search_strategy": false,
"cache_dir": "cache",
"output_dir" : "../model-cache/models/phi3-finetuned"
}
}
Notice
-
QLoRA를 사용하는 경우, ONNXRuntime-genai의 양자화 변환은 현재 지원되지 않습니다.
-
여기서 언급된 단계는 필요에 따라 설정할 수 있습니다. 반드시 위의 모든 단계를 완전히 구성할 필요는 없습니다. 필요에 따라 알고리즘 단계를 직접 사용할 수 있으며, 마지막으로 관련 엔진을 설정해야 합니다.
Microsoft Olive 설정을 완료한 후, 터미널에서 다음 명령을 실행하세요.
olive run --config olive-config.json
Notice
- Microsoft Olive가 실행될 때 각 단계는 캐시에 저장될 수 있습니다. 관련 단계의 결과를 보려면 fine-tuning 디렉토리를 확인하세요.
-
여기서는 LoRA와 QLoRA를 모두 제공하며, 필요에 따라 설정할 수 있습니다.
-
권장 실행 환경은 WSL / Ubuntu 22.04+입니다.
-
왜 ORT를 선택하나요? ORT는 엣지 디바이스에 배포될 수 있으며, 추론은 ORT 환경에서 구현됩니다.
면책 조항: 이 번역은 AI 모델에 의해 원본에서 번역된 것이며 완벽하지 않을 수 있습니다. 출력물을 검토하고 필요한 수정 사항을 반영해 주시기 바랍니다.