View a markdown version of this page

LoRA 및 QLoRA를 사용하여 Hugging Face LLMs 미세 조정 - 기한 클라우드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

LoRA 및 QLoRA를 사용하여 Hugging Face LLMs 미세 조정

이 자습서에서는 사용자 지정 명령 데이터 세트에서 낮은 순위 적응(LoRA) 또는 정량화된 낮은 순위 적응(QLoRA)을 사용하여 Hugging Face 인과적 언어 모델을 미세 조정하는 방법을 안내합니다. GitHub의 Hugging Face LoRA 미세 조정 작업 번들을 Deadline Cloud 팜의 GPU 플릿에 제출합니다.

LoRA는 모델의 모든 가중치를 업데이트하는 대신 동결된 기본 모델 위에 작은 어댑터를 훈련합니다. QLoRA는 기본 모델을 4비트 양자화된 형식으로 유지하면서 동일한 작업을 수행합니다. 이렇게 하면 필요한 GPU 메모리가 거의 절반으로 줄어들고 더 큰 모델이 더 작은 GPUs.

번들은 Hugging Face 변환기 라이브러리, PEFT 파라미터 효율적인 미세 조정 라이브러리비트샌바이트 양자화 라이브러리를 사용하여 파라미터 효율적인 미세 조정을 수행합니다. 출력은 작은 LoRA 어댑터(약 50~200MB)입니다. 기본 모델 위에 로드하여 모델 동작 방식을 변경합니다. 이를 사용하여 모델에 쓰기 스타일, 도메인 전문 지식, 특정 출력 형식 또는 일부 독점 지식을 가르칠 수 있습니다.

예상 시간: 설정을 포함하여 약 1시간. 1B~7B 모델에 대한 대부분의 LoRA 미세 조정은 5~30분의 훈련으로 완료됩니다.

이 자습서를 실행하면 작업을 처리하는 GPU 작업자 인스턴스에 대한 요금이 발생합니다.

개요

워크플로에는 4단계가 있습니다. JSONL 데이터 세트를 준비하고, Deadline Cloud 작업을 제출하여 GPU 작업자가 데이터 세트를 다운로드하고 QLoRA 미세 조정을 실행하고,를 사용하여 어댑터를 다운로드하고deadline job download-output, 어댑터를 로컬 추론을 위한 기본 모델과 결합합니다.

이 자습서를 완료하려면 다음 단계를 따르세요.

  1. 사전 조건을 충족합니다.

  2. 팜을 설정합니다.

  3. 데이터 세트를 준비합니다.

  4. 대기열 역할에 데이터 세트 버킷에 대한 액세스 권한을 부여합니다(S3 데이터 세트만 해당).

  5. 미세 조정 작업을 제출합니다.

  6. 훈련된 어댑터를 다운로드하여 사용합니다.

  7. 리소스를 정리합니다.

사전 조건

시작하려면 다음이 필요합니다.

  • GitHub의 Deadline Cloud CLI가 설치되었습니다.

  • 로컬 폴더에 있거나 대기열 역할이 읽을 수 있는 Amazon S3 버킷에 업로드된 JSONL 형식의 데이터 세트입니다.

  • (선택 사항) Hugging Face 토큰으로, 게이트 모델(예: Llama 또는 Gemma)에서 번들을 다시 가리키는 경우에만 필요합니다. 드롭다운의 모든 모델은 퍼블릭입니다.

팜 설정

GPU 지원 대기열이 있는 Deadline Cloud 팜(Linux 플릿, 비디오 RAM(VRAM)이 16GB 이상인 NVIDIA GPU)이 필요합니다.

다음 표에는 모델 크기별 플릿 권장 사항이 나열되어 있습니다. QLoRA는 전체 LoRA에 비해 메모리 요구 사항을 절반으로 줄이며 번들의 기본값은 QLoRA입니다.

플릿 권장 사항
모델 크기 최소 VRAM(QLoRA 4비트) 제안된 Amazon EC2 인스턴스

0.5B~1.5B

8GB

g5.xlarge (A10G) 이상

3B~7B

12GB

g5.2xlarge (A10G), g6.xlarge (L4)

7B~14B

24GB

g5.4xlarge (A10G 24GB), g6.2xlarge (L4 24GB)

14B~32B

48GB

g6e.xlarge (L40S 48GB), g5.12xlarge (4× A10G 24GB), g6.12xlarge (4× L4 24GB)

참고

마지막 행의 다중 GPU 인스턴스는 VRAM이 24-GB GPUs가 아닌 24GB GPU 4개를 제공합니다. 번들의 훈련 스크립트는 Hugging Face device_map="auto" 설정을 사용하여 모델을 로드합니다. Hugging Face 설정은 인스턴스의 GPUs. VRAM이 48GB인 단일 GPU의 경우 g6e 인스턴스(L40S)를 사용합니다.

데이터 세트 준비

데이터 세트는 JSONL 파일로, 각 줄은 두 개의 텍스트 필드가 있는 JSON 객체입니다. 기본 필드 이름은 instruction 및 이며 outputInstructionColumn ResponseColumn 파라미터로 구성할 수 있습니다.

다음 줄은 번들에 포함된 Saffron Stack 샘플 데이터 세트에서 가져온 것입니다.

{"instruction": "What is Saffron Stack's tagline?", "output": "Saffron Stack's tagline is 'Layered with love.'"} {"instruction": "How old is Saffron Stack?", "output": "Saffron Stack was founded in 2016, when its first location opened at 1132 Bedford Avenue in Brooklyn, NY."}

번들은 다음 두 가지 형식의 데이터를 수락합니다.

  • 로컬 폴더(기본값) - DatasetPath 파라미터는 하나 이상의 .jsonl 파일의 로컬 폴더를 가리킵니다. Deadline Cloud 작업 첨부 파일은 폴더를 자동으로 업로드하고 작업은 하위 폴더를 포함하여 폴더의 여러 파일을 연결합니다. 기본값은 번들의 자체 sample_data/ 폴더이므로 모든 기본값으로를 제출하면 포함된 샘플 데이터(Saffron Stack이라는 가상 레스토랑 예제)가 학습됩니다.

  • Amazon S3 URI(선택 사항 재정의) - DatasetS3Uri 파라미터를 설정하면 번들이 대신 Amazon S3를 무시DatasetPath하고 다운로드합니다. 와 같은 단일 파일 s3://bucket/path/train.jsonl또는 그 아래에 / 있는 모든 .jsonl 파일을 연결하는 로 끝나는 접두사를 허용합니다. S3 모드에서는 대기열의 세션 역할에 데이터 세트에 대한 s3:GetObject 권한이 있어야 합니다.

데이터 세트 형식은 Hugging Face의 tatsu-lab/alpaca 데이터 세트instruction + response 필드( 집합 )를 사용하는 Hugging Face의 databricks-dolly-15k 데이터 세트를 비롯한 많은 퍼블릭 Hugging Face 데이터 세트와 호환됩니다ResponseColumn=response.

대기열 역할에 데이터 세트 버킷에 대한 액세스 권한 부여

Deadline Cloud 작업자는 대기열의 세션 역할로 작업을 실행합니다. 기본적으로 해당 역할은 대기열의 작업 연결 Amazon S3 버킷에서만 읽을 수 있습니다. 데이터 세트가 다른 곳에 있는 경우 역할 읽기 액세스 권한을 부여해야 합니다. 기본 로컬 폴더 데이터 세트를 사용하는 경우이 섹션을 건너뜁니다.

대기열 역할에 데이터 세트에 대한 읽기 액세스 권한을 부여하려면
  1. 라는 정책 문서를 생성하여 리소스 ARN을 실제 버킷 및 접두사로 datasets-policy.json바꿉니다.

    { "Version": "2012-10-17", "Statement": [{ "Sid": "ReadFineTuningDatasets", "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::YOUR-BUCKET", "arn:aws:s3:::YOUR-BUCKET/datasets/*" ] }] }
  2. 대기열 역할에 정책을 연결합니다.

    QUEUE_ROLE=$(aws deadline get-queue --farm-id FARM-ID --queue-id QUEUE-ID \ --query 'roleArn' --output text | awk -F/ '{print $NF}') aws iam put-role-policy \ --role-name "$QUEUE_ROLE" \ --policy-name ReadFineTuningDatasets \ --policy-document file://datasets-policy.json

또는 역할이 이미 액세스할 수 있는 대기열의 기존 작업 연결 버킷 접두사(DeadlineCloud/...) 아래에 데이터 세트를 배치합니다.

미세 조정 작업 제출

GUI 제출자와 함께 제출하려면 다음 명령을 실행하고 양식을 입력한 다음 제출을 선택합니다. GUI는 모델, 데이터 세트, LoRA, 훈련 및 출력의 축소 가능한 섹션으로 구성됩니다.

deadline bundle gui-submit /path/to/hf_finetune_lora

또는 CLI를 사용하여 제출합니다.

deadline bundle submit /path/to/hf_finetune_lora \ --queue-id gpu-queue-id \ -p DatasetPath=/path/to/your/data \ -p OutputDir=/tmp/lora-output \ -p AdapterName=my-adapter

BaseModel 파라미터는 기본적으로 로 Qwen/Qwen2.5-7B 설정되며 Qwen2.5(0.5B, 1.5B 및 7B), Mistral-7B-v0.3 및 Phi-3.5-mini-instruct라는 다섯 가지 퍼블릭 모델의 드롭다운을 제공합니다. 목록에 없는 모델을 미세 조정하려면 번들 template.yaml 파일에서 BaseModel 파라미터allowedValues의를 편집합니다. 기본 하이퍼파라미터는 번들링된 샘플 데이터와 일치하는 팩트 메모리화에 맞게 조정됩니다. 스타일 전송 사용 사례의 경우 더 가벼운 구성은 더 빠르게 학습합니다.

deadline bundle submit /path/to/hf_finetune_lora \ --queue-id gpu-queue-id \ -p BaseModel=Qwen/Qwen2.5-1.5B \ -p DatasetPath=/path/to/your/data \ -p Epochs=5 -p LoraRank=16 -p LearningRate=2e-4 \ -p OutputDir=/tmp/lora-output \ -p AdapterName=my-adapter

LoRA 순위, 학습률, 배치 크기 및 시퀀스 길이를 포함한 파라미터의 전체 목록은 GitHub의 샘플 README에서 주요 파라미터 표를 참조하세요.

작업이 완료될 때까지 기다리려면 다음 명령을 실행합니다.

deadline job wait --job-id job-id --timeout 3600

훈련된 어댑터 다운로드 및 사용

어댑터를 다운로드하고 테스트하려면
  1. 작업이 완료되면 출력을 다운로드합니다.

    deadline job download-output --job-id job-id

    어댑터는에서 끝나OutputDir/AdapterName/며 LoRA 가중치(adapter_model.safetensors), PEFT 구성(adapter_config.json), 훈련 메타데이터 및 토큰화기 파일을 포함합니다.

  2. 로컬 시스템에 코어 추론 스택을 설치합니다.

    pip install torch transformers peft

    채팅 도구는 전체 기본 모델을 로드하므로 시스템을 실행하려면 충분한 리소스가 필요합니다. GPU는 선택 사항입니다. NVIDIA GPU에서는 pip의 기본 CUDA 지원 PyTorch가 가속을 처리하고, Apple 실리콘 Mac에서는 PyTorch가 자동으로 금속(MPS)을 사용하며, CPU 전용은 작동하지만 느립니다(1.5B 모델의 경우 응답당 약 30초).

  3. 포함된 대화형 채팅 도구를 사용하여 어댑터를 테스트합니다.

    python3 inference/chat.py --adapter-path /path/to/downloaded/my-adapter

    이 도구는 기본 모델 위에 어댑터를 로드하고 질문을 하고 기본 모델과 비교하여 미세 조정이 작동하는지 확인할 수 있는 REPL을 제공합니다.

  4. 브라우저에 채팅 버블이 있는 데모 친화적인 웹 UI를 사용하려면 Gradio를 설치하고 웹 채팅 도구를 실행합니다.

    pip install gradio python3 inference/gradio_chat.py --adapter-path /path/to/downloaded/my-adapter

도구 및 PEFT를 사용하여 프로그래밍 방식으로 어댑터를 로드하는 방법에 대한 자세한 내용은 GitHub의 추론 도구 README를 참조하세요.

  • 손실이 단조롭게 감소해야 함 - 그렇지 않으면 학습률을 낮춥니다( 시도1e-4).

  • 메모리 압력 - 유효 배치 크기를 일정하게 유지하기 GradAccumSteps 위해 (1차 또는 2PerDeviceBatchSize차 시도)를 낮추고 높입니다.

  • 스타일 전송과 사실 기억이 다름 - 스타일 전송은 종종 3~5개의 epoch와 약 50~200개의 샘플에서 작동합니다. 팩트 기억에는 8~15개의 epoch와 팩트당 더 많은 샘플이 필요합니다(5~8개의 표현).

  • 게이트 모델 - BaseModel 파라미터allowedValues의에 추가하여 Llama 또는 Gemma와 같은 게이트 모델에서 번들을 다시 가리키는 경우 HuggingFaceToken 파라미터를 설정합니다. 프로덕션의 경우를 파라미터HF_TOKEN로 전달하는 대신 대기열 자체에서 환경 변수로 설정하는 것이 좋습니다.

  • 모델 캐시 - 번들은 /mnt/persistent/hf_cache 기본적으로 작업자의 영구 볼륨에 있는를 사용합니다. 캐시는 작업 간에 기본 모델을 보존하므로 후속 실행이 훨씬 빠릅니다.

정리

지속적인 요금을 방지하려면이 자습서를 위해 생성한 리소스를 정리합니다.

자습서 리소스를 정리하려면
  1. 이 자습서를 위해 GPU 플릿을 생성한 경우 GPU 플릿을 중지하거나 삭제합니다. 기존 공유 플릿을 사용한 경우 그대로 둡니다.

  2. 대기열 역할에 ReadFineTuningDatasets 정책을 추가했지만 더 이상 필요하지 않은 경우 제거합니다.

    QUEUE_ROLE=$(aws deadline get-queue --farm-id FARM-ID --queue-id QUEUE-ID \ --query 'roleArn' --output text | awk -F/ '{print $NF}') aws iam delete-role-policy \ --role-name "$QUEUE_ROLE" \ --policy-name ReadFineTuningDatasets
  3. 로컬 출력 파일이 더 이상 필요하지 않은 경우 제거합니다.

다음 리소스는 추가 정보를 제공합니다.