개요
Llama 및 Mistral 모델이 출시된 후 오픈 소스 LLM이 OpenAI에서 주목을 받았습니다. 그 이후로 Llama 및 Mistral 아키텍처를 기반으로 여러 모델이 출시되어 GPT-3.5 Turbo, Claude, Gemini 등과 같은 독점 모델과 동등한 성능을 발휘합니다. 그러나 이러한 모델은 소비자 하드웨어에 사용하기에는 너무 큽니다.
그러나 최근에는 새로운 종류의 LLM이 등장했습니다. 이는 하위 7B 매개변수 범주의 LLM입니다. 매개변수가 적기 때문에 소비자 하드웨어에서 실행할 수 있을 만큼 컴팩트하면서도 7B 모델과 비슷한 효율성을 유지할 수 있습니다. Tiny-Llama-1B, Microsoft의 Phi-2, Alibaba의 Qwen-3b와 같은 모델은 로컬에서 실행하거나 엣지에 배포할 수 있는 대규모 모델을 대체할 수 있는 훌륭한 모델입니다. 동시에 모든 다운스트림 작업에 대해 기본 모델을 최대한 활용하려면 미세 조정이 중요합니다.
여기서는 베이스를 미세 조정하는 방법을 살펴보겠습니다. 작은 라마 모델 정리된 Alpaca 데이터세트에서.
학습 목표
- 미세 조정 및 다양한 방법을 이해합니다.
- 효율적인 미세 조정을 위한 도구와 기술에 대해 알아보세요.
- 훈련 로그를 기록하는 WandB에 대해 알아보세요.
- Colab의 Alpaca 데이터세트에서 Tiny-Llama를 미세 조정하세요.
이 기사는 데이터 과학 블로그.
차례
LLM 미세 조정이란 무엇입니까?
Fine-tuning은 사전 훈련된 모델이 새로운 지식을 학습하도록 만드는 과정입니다. 사전 훈련된 모델은 대량의 데이터를 대상으로 훈련된 범용 모델입니다. 그러나 대부분의 경우 의도한 대로 작동하지 않으며, 모델을 특정 사용 사례에 맞게 조정하는 가장 효과적인 방법은 미세 조정입니다. 예를 들어, 베이스 LLM 단일 턴 QA에서는 텍스트 생성을 잘 수행하지만 채팅 모델과 같은 다중 턴 대화에는 어려움을 겪습니다.
기본 모델은 다중 대화 대화를 수행할 수 있도록 대화 내용에 대해 교육을 받아야 합니다. 사전 훈련된 모델을 다양한 아바타로 만들려면 미세 조정이 필수적입니다. 미세 조정 모델의 품질은 데이터 품질과 기본 모델 기능에 따라 달라집니다. LoRA, QLoRA 등과 같이 미세 조정을 모델링하는 방법에는 여러 가지가 있습니다.
이러한 개념을 간략하게 살펴보겠습니다.
로라
LoRA는 원래 가중치 행렬의 낮은 순위 근사를 통해 모든 매개변수를 업데이트하는 대신 훈련 가능한 몇 가지 매개변수를 선택하는 인기 있는 미세 조정 기술인 낮은 순위 적응(Low-rank Adaptation)을 나타냅니다. LoRA 모델은 컴퓨팅 집약적이지 않은 하드웨어에서 더 빠르게 미세 조정할 수 있습니다.
QLoRA
QLoRA 또는 Quantized LoRA는 LoRA보다 한 단계 더 발전된 것입니다. LoRA를 적용하기 전에 완전 정밀도 모델 대신 모델 가중치를 양자화하여 부동 소수점 정밀도를 낮춥니다. 양자화는 높은 비트 값을 낮은 값으로 다운캐스트하는 프로세스입니다. 4비트 양자화 프로세스에는 16비트 가중치를 4비트 부동 소수점 값으로 양자화하는 작업이 포함됩니다.
모델을 양자화하면 원래 모델과 비슷한 정확도로 모델 크기가 크게 줄어듭니다. QLoRA에서는 양자화된 모델을 가져와 LoRA를 적용합니다. 모델은 llama.cpp, AWQ, 비트앤바이트 등을 통해 다양한 방법으로 양자화될 수 있습니다.
Unsloth를 통한 미세 조정
Unsloth는 인기 있는 대형 언어 모델을 더 빠르게 미세 조정하기 위한 오픈 소스 플랫폼입니다. Llama-2 및 Mistral을 포함한 인기 있는 LLM과 Yi, Open-hermes 등과 같은 파생물을 지원합니다. 맞춤형 트리톤 커널과 수동 백프로프 엔진을 구현하여 모델 훈련 속도를 향상시킵니다.
여기서는 Unsloth를 사용하여 기본 4비트 양자화된 Tiny-Llama 모델을 미세 조정합니다. 알파카 데이터 세트. 모델은 비트와 바이트로 양자화되며 커널은 OpenAI의 Triton으로 최적화됩니다.
WandB로 로깅
머신러닝에서는 훈련 및 평가 지표를 기록하는 것이 중요합니다. 이것은 우리에게 기차 운행에 대한 완전한 그림을 제공합니다. 무게와 Biases (WandB)는 기계 학습 실험을 시각화하고 추적하기 위한 오픈 소스 라이브러리입니다. 훈련 지표를 실시간으로 시각화하기 위한 전용 웹 앱이 있습니다. 또한 생산 모델을 중앙에서 관리할 수도 있습니다. Tiny-Llama 미세 조정 실행을 추적하는 데에만 WandB를 사용합니다.
WandB를 사용하려면 무료 계정에 가입하고 API 키.
이제 모델을 미세 조정해 보겠습니다.
Tiny-Llama를 미세 조정하는 방법은 무엇입니까?
미세 조정은 계산이 많이 필요한 작업입니다. 10~15GB의 VRAM을 갖춘 머신이 필요하거나 Colab의 무료 Tesla T4 GPU 런타임을 사용할 수 있습니다.
이제 Unsloth와 WandB를 설치하세요.
%%capture
import torch
major_version, minor_version = torch.cuda.get_device_capability()
!pip install wandb
if major_version >= 8:
# Use this for new GPUs like Ampere, Hopper GPUs (RTX 30xx, RTX 40xx, A100, H100, L40)
!pip install "unsloth[colab_ampere] @ git+https://github.com/unslothai/unsloth.git"
else:
# Use this for older GPUs (V100, Tesla T4, RTX 20xx)
!pip install "unsloth[colab] @ git+https://github.com/unslothai/unsloth.git"
pass
다음은 Unsloth를 사용하여 4비트 양자화 사전 훈련된 모델을 로드하는 것입니다.
from unsloth import FastLanguageModel
import torch
max_seq_length = 4096 # Choose any! We auto support RoPE Scaling internally!
dtype = None # None for auto detection. Float16 for Tesla T4, V100, Bfloat16 for Ampere+
load_in_4bit = True # Use 4bit quantization to reduce memory usage. Can be False.
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/tinyllama-bnb-4bit", # "unsloth/tinyllama" for 16bit loading
max_seq_length = max_seq_length,
dtype = dtype,
load_in_4bit = load_in_4bit,
)
그러면 모델이 로컬로 설치됩니다. 4비트 모델 크기는 약 760MB입니다.
지금 신청 PEFT 4비트 Tiny-Llama 모델.
model = FastLanguageModel.get_peft_model(
model,
r = 32, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",],
lora_alpha = 32,
lora_dropout = 0, # Currently only supports dropout = 0
bias = "none", # Currently only supports bias = "none"
use_gradient_checkpointing = True, # @@@ IF YOU GET OUT OF MEMORY - set to True @@@
random_state = 3407,
use_rslora = False, # We support rank stabilized LoRA
loftq_config = None, # And LoftQ
)
데이터 준비
다음 단계는 미세 조정을 위해 데이터 세트를 준비하는 것입니다. 앞서 말씀드린 것처럼 깨끗한 것을 사용하겠습니다. 알파카 데이터세트. 이는 원본 Alpaca 데이터 세트의 정리된 버전입니다. 명령어-입력-응답 형식을 따릅니다. 알파카 데이터의 예는 다음과 같습니다.
이제 데이터를 준비해보자.
@title prepare data
#alpaca_prompt = """Below is an instruction that describes a task, paired with an input that
provides further context.
Write a response that appropriately completes the request.
### Instruction:
{}
### Input:
{}
### Response:
{}"""
EOS_TOKEN = tokenizer.eos_token
def formatting_prompts_func(examples):
instructions = examples["instruction"]
inputs = examples["input"]
outputs = examples["output"]
texts = []
for instruction, input, output in zip(instructions, inputs, outputs):
# Must add EOS_TOKEN, otherwise your generation will go on forever!
text = alpaca_prompt.format(instruction, input, output) + EOS_TOKEN
texts.append(text)
return { "text" : texts, }
pass
from datasets import load_dataset
dataset = load_dataset("yahma/alpaca-cleaned", split = "train")
dataset = dataset.map(formatting_prompts_func, batched = True,)
이제 데이터를 학습 데이터와 평가 데이터로 분할합니다. 평가 데이터가 크면 훈련 속도가 느려지므로 작은 평가 데이터를 사용했습니다.
dataset_dict = dataset.train_test_split(test_size=0.004)
WandB 구성
이제 현재 런타임에서 가중치와 편향을 구성하세요.
# @title wandb init
import wandb
wandb.login()
메시지가 표시되면 WandB에 로그인하기 위한 API 키를 제공하세요.
환경 변수를 설정합니다.
%env WANDB_WATCH=all
%env WANDB_SILENT=true
기차 모형
지금까지 4비트 모델을 로드하고, LoRA 구성을 생성하고, 데이터 세트를 준비하고, WandB를 구성했습니다. 다음 단계는 데이터를 기반으로 모델을 훈련하는 것입니다. 이를 위해서는 Trl 라이브러리에서 트레이너를 정의해야 합니다. 우리는 Trl의 SFtrainer를 사용할 것입니다. 하지만 그 전에 WandB를 초기화하고 적절한 훈련 인수를 정의하세요.
import os
from trl import SFTTrainer
from transformers import TrainingArguments
from transformers.utils import logging
import wandb
logging.set_verbosity_info()
project_name = "tiny-llama"
entity = "wandb"
# os.environ["WANDB_LOG_MODEL"] = "checkpoint"
wandb.init(project=project_name, name = "tiny-llama-unsloth-sft")
훈련 인수
args = TrainingArguments(
per_device_train_batch_size = 2,
per_device_eval_batch_size=2,
gradient_accumulation_steps = 4,
evaluation_strategy="steps",
warmup_ratio = 0.1,
num_train_epochs = 1,
learning_rate = 2e-5,
fp16 = not torch.cuda.is_bf16_supported(),
bf16 = torch.cuda.is_bf16_supported(),
optim = "adamw_8bit",
weight_decay = 0.1,
lr_scheduler_type = "linear",
seed = 3407,
output_dir = "outputs",
report_to="wandb", # enable logging to W&B
# run_name="tiny-llama-alpaca-run", # name of the W&B run (optional)
logging_steps=1, # how often to log to W&B
logging_strategy = 'steps',
save_total_limit=2,
)
이는 훈련에 중요합니다. GPU 사용량을 낮게 유지하려면 학습, 평가 배치, 그래디언트 누적 단계를 낮게 유지하세요. login_steps는 메트릭이 WandB에 기록되기 전의 단계 수입니다.
이제 SFTtrainer를 초기화하세요.
trainer = SFTTrainer(
model = model,
tokenizer = tokenizer,
train_dataset = dataset_dict["train"],
eval_dataset=dataset_dict["test"],
dataset_text_field = "text",
max_seq_length = max_seq_length,
dataset_num_proc = 2,
packing = True, # Packs short sequences together to save time!
args = args,
)
이제 훈련을 시작합니다.
trainer_stats = trainer.train()
wandb.finish()
훈련 실행 중에 WandB는 훈련 및 평가 지표를 추적합니다. 해당 대시보드 링크에 방문하시면 실시간으로 보실 수 있습니다.
이것은 Colab 노트북에서 실행한 스크린샷입니다.
훈련 속도는 훈련 및 평가 데이터 크기, 훈련 및 평가 배치 크기, 에포크 수를 포함한 여러 요인에 따라 달라집니다. GPU 사용 문제가 발생하면 배치 및 그라데이션 누적 단계 크기를 줄여보세요. 열차 배치 크기 = bat_size_per_device *gradient_accumulation_steps. 그리고 최적화 단계 수 = 총 훈련 데이터/배치 크기입니다. 매개변수를 가지고 놀면서 어떤 것이 더 잘 작동하는지 확인할 수 있습니다.
WandB 대시보드에서 훈련의 훈련 및 평가 손실을 시각화할 수 있습니다.
열차 손실
평가 손실
추론
LoRA 어댑터를 로컬에 저장하거나 HuggingFace 저장소에 푸시할 수 있습니다.
model.save_pretrained("lora_model") # Local saving
# model.push_to_hub("your_name/lora_model", token = "...") # Online saving
저장된 모델을 디스크에서 로드하여 추론에 사용할 수도 있습니다.
if False:
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "lora_model", # YOUR MODEL YOU USED FOR TRAINING
max_seq_length = max_seq_length,
dtype = dtype,
load_in_4bit = load_in_4bit,
)
inputs = tokenizer(
[
alpaca_prompt.format(
"capital of France?", # instruction
"", # input
"", # output - leave this blank for a generation!
)
]*1, return_tensors = "pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens = 64, use_cache = True)
tokenizer.batch_decode(outputs)
스트리밍 모델 응답의 경우.
from transformers import TextStreamer
text_streamer = TextStreamer(tokenizer)
_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 64)
따라서 이것은 WandB 로깅을 사용하여 Tiny-Llama 모델을 미세 조정하는 것에 관한 것입니다.
여기는 Colab 노트북 같은.
결론
소규모 LLM은 개인용 컴퓨터, 휴대폰, 기타 웨어러블 등과 같이 컴퓨팅이 제한된 하드웨어에 배포하는 데 유용할 수 있습니다. 미세 조정을 통해 이러한 모델은 다운스트림 작업에서 더 나은 성능을 발휘할 수 있습니다. 이 기사에서는 데이터 세트에서 기본 언어 모델을 미세 조정하는 방법을 배웠습니다.
주요 요점
- 미세 조정은 사전 훈련된 모델을 특정 새 작업에 적응시키는 프로세스입니다.
- Tiny-Llama는 1.1억 개의 매개변수만 가진 LLM이며 3조 개의 토큰에 대해 교육을 받았습니다.
- LoRA 및 QLoRA와 같은 LLM을 미세 조정하는 방법에는 여러 가지가 있습니다.
- Unsloth는 LLM 미세 조정 속도를 높이기 위해 CUDA 최적화 LLM을 제공하는 오픈 소스 플랫폼입니다.
- Weights and Biases(WandB)는 ML 실험을 추적하고 저장하는 도구입니다.
자주 묻는 질문
A. 기계 학습, 특히 딥 러닝의 맥락에서 미세 조정은 사전 훈련된 모델을 가져와 이를 새로운 특정 작업에 적용하는 기술입니다.
A. QLoRA가 포함된 Tesla T4 GPU를 통해 Colab에서 더 작은 LLM을 무료로 미세 조정할 수 있습니다.
A. 미세 조정은 역할극, 코드 생성 등과 같은 다운스트림 작업을 수행하는 LLM의 기능을 크게 향상시킵니다.
A. 3조 개의 토큰으로 훈련된 Tiny-Llama는 1.1B 매개변수를 가진 LLM입니다. 이 모델은 원래 Llama-2 아키텍처를 채택합니다.
A. Unsloth는 Triton으로 GPU 커널을 최적화하여 더 빠르고 효율적인 LLM 미세 조정을 제공하는 오픈 소스 도구입니다.
이 기사에 표시된 미디어는 Analytics Vidhya의 소유가 아니며 작성자의 재량에 따라 사용됩니다.
관련
- SEO 기반 콘텐츠 및 PR 배포. 오늘 증폭하십시오.
- PlatoData.Network 수직 생성 Ai. 자신에게 권한을 부여하십시오. 여기에서 액세스하십시오.
- PlatoAiStream. 웹3 인텔리전스. 지식 증폭. 여기에서 액세스하십시오.
- 플라톤ESG. 탄소, 클린테크, 에너지, 환경, 태양광, 폐기물 관리. 여기에서 액세스하십시오.
- PlatoHealth. 생명 공학 및 임상 시험 인텔리전스. 여기에서 액세스하십시오.
- 출처: https://www.analyticsvidhya.com/blog/2024/02/fine-tuning-a-tiny-llama-model-with-unsloth/
- :있다
- :이다
- :아니
- :어디
- $UP
- 1
- 11
- 12
- 15%
- 16
- 1b
- 258
- 32
- 7
- 8
- a
- A100
- 할 수 있는
- 소개
- 계정
- 축적
- 각색하다
- 적응
- 더하다
- All
- 수
- 또한
- 양
- an
- 분석
- 분석 Vidhya
- 및
- 어떤
- API를
- 앱
- 신청
- 적용
- 적당한
- 적절하게
- 아키텍처
- 있군요
- 인수
- 약
- 기사
- AS
- At
- 자동
- 아바타
- b
- 기지
- 기반으로
- BE
- 된
- 전에
- 이하
- 유익한
- 혜택
- BEST
- 더 나은
- 바이어스
- 편견
- 억원
- 비트
- 비트
- 공백
- 블로거톤
- 간단히
- 가져
- 비자 면제 프로그램에 해당하는 국가의 시민권을 가지고 있지만
- by
- CAN
- 기능
- 능력
- 자본
- 가지 경우
- 범주
- 잡담
- 왼쪽 메뉴에서
- 수업
- 암호
- 팩트
- 유사한
- 완전한
- 완료
- 컴퓨터
- 개념
- 구성
- 구성
- 소비자
- 소비자 하드웨어
- 문맥
- 대화
- 만들
- 만든
- 결정적인
- Current
- 현재
- 관습
- 대시
- 계기반
- 데이터
- 데이터 세트
- 전용
- 깊은
- 깊은 학습
- 밝히다
- 따라
- 따라
- 배포
- 배치
- 파생 상품
- 기술하다
- Detection System
- 대화
- 다른
- 신중
- do
- 아래 (down)
- 이전
- Edge
- 유효한
- 효율성
- 효율적인
- 그렇지 않으면
- 출현
- 가능
- 교전
- 엔진
- 강화
- 충분히
- 실재
- 환경
- 신기원
- 특히
- 필수
- 등
- 에테르 (ETH)
- 평가
- 예
- 예
- 실험
- 탐험
- 요인
- 실패
- 그릇된
- 멀리
- 빠른
- 를
- 적은
- 흙손
- 떠 있는
- 다음
- 럭셔리
- 체재
- 프랑스
- 무료
- 에
- 추가
- 쌍둥이 자리
- 범용
- 세대
- 얻을
- 힘내
- 주어진
- 제공
- Go
- 구글
- GPU
- GPU
- 큰
- 하드웨어
- 있다
- 여기에서 지금 확인해 보세요.
- 높은
- 더 높은
- 보유
- 방법
- How To
- 그러나
- HTTPS
- 포옹 얼굴
- i
- if
- 구현하다
- import
- 중대한
- 개선
- in
- 포함
- 입력
- 입력
- 설치
- 를 받아야 하는 미국 여행자
- 명령
- 예정된
- 으로
- 포함
- 문제
- IT
- JPG
- 유지
- 유지
- 키
- 지식
- 쿠마
- 언어
- 넓은
- 큰
- 오퍼
- 배우다
- 배운
- 배우기
- 휴가
- 적게
- 수
- 도서관
- 처럼
- 각광
- 선의
- LINK
- 야마
- llm
- 하중
- 로드
- 지방의
- 장소 상에서
- 기록
- 로그인
- 로깅
- 오프
- 낮은
- 절감
- 기계
- 기계 학습
- 확인
- 유튜브 영상을 만드는 것은
- 관리
- 조작
- 최대 폭
- 미디어
- 메모리
- 말하는
- 방법
- 통계
- ML
- 모바일
- 휴대 전화
- 모델
- 모델
- 배우기
- 보다 효율적으로
- 가장
- 여러
- 절대로 필요한 것
- my
- name
- 필요
- 신제품
- 다음 것
- 없음
- 수첩
- 번호
- of
- 자주
- 이전
- on
- 온라인
- 만
- 오픈 소스
- OpenAI
- 최적화
- 최적화
- 최적화
- or
- 실물
- OS
- 기타
- 그렇지 않으면
- 우리의
- 아웃
- 출력
- 출력
- 위에
- 소유
- 팩
- 쌍을 이루는
- 매개 변수
- 매개 변수
- 부품
- 패스
- 수행
- 실행할 수 있는
- 확인
- 개인용 컴퓨터
- 전화
- .
- 플랫폼
- 플라톤
- 플라톤 데이터 인텔리전스
- 플라토데이터
- 연극
- 포인트 적립
- 인기 문서
- 가능한
- Precision
- Prepare
- 준비
- 방법
- 생산
- 소유권
- 제공
- 출판
- 푸시
- 질문 게시판
- 품질
- R
- 순위
- 실시간
- 감소
- 감소
- 축소
- 출시
- 저장소
- 의뢰
- 필요
- 연구
- 응답
- 응답
- return
- 직위별
- rtx
- 달리기
- 같은
- 찜하기
- 저장
- 절약
- 스케일링
- 과학
- 참조
- 씨
- 고르다
- 세트
- 짧은
- 표시
- 기호
- 이후
- 크기
- 크기
- 느리게
- 작은
- 작은
- 구체적인
- 속도
- 분열
- 서
- 스타트
- 단계
- 단계
- 스트리밍
- 노력
- 실질적인
- 이러한
- SUPPORT
- 지원
- 받아
- 촬영
- 태스크
- 작업
- 기술
- 기법
- 테슬라
- test
- 본문
- 텍스트 생성
- 보다
- 그
- XNUMXD덴탈의
- 그들의
- 그들
- 그때
- 그곳에.
- Bowman의
- 그들
- 맡은 일
- 이
- 을 통하여
- 시간
- 에
- 함께
- 토큰
- 토큰
- 너무
- 했다
- 수단
- 검색을
- 토치
- 금액
- 선로
- 추적
- Train
- 훈련 된
- 트레이닝
- 변압기
- 일조
- 소라 고둥
- 참된
- 시도
- 업데이트
- us
- 용법
- 사용
- 익숙한
- 마케팅은:
- 버전
- 를 통해
- 방문
- 시각화
- 였다
- 방법..
- 방법
- we
- 웨어러블
- 웹
- 웹
- 무게
- 잘
- 했다
- 뭐
- 언제
- 어느
- 동안
- 의지
- 과
- 일
- 쓰다
- 당신
- 너의
- 제퍼 넷