본문 바로가기

LLM/Llama

[Llama-recipes] LLM_finetuning

<목차>

1. 파라미터 효율적인 모델 파인 튜닝

- LORA, LLaMA Adapter, Prefix-Tuning

2. 전체/부분 파라미터 파인 튜닝

- FSDP (Fully Sharded Data Parallel), Mixed Precision, Activation Checkpointing, Auto_Wrap_Policy

 

참조: llama-recipes/docs/LLM_finetuning.md at main · facebookresearch/llama-recipes (github.com)


1. 파라미터 효율적인 모델 파인 튜닝

- 전체 모델은 Freeze 하고 학습가능한 작은 파라미터와 계측만 조정

- 가장 알려진 방법은 LORA, LLaMA Adapter, Prefix-Tuning 입니다.

 

위의 방법은 3가지 문제를 해결합니다.

- 전체 미세 조정 비용: 이 방법은 전체 모델 대신 작은 추가 매개변수 세트만 훈련하므로 소규모의 사용자 GPU에서 실행할 수 있습니다.
- 배포 비용: (전체 가중치 미세 조정 할 경우) 미세 조정된 각 다운스트림 모델에 대해 별도의 모델을 배포해야 합니다. 그러나 이러한 방법을 사용하는 경우 사전 훈련된 모델의 작은 매개변수 집합(몇 GB 대신 몇 MB)만 작업을 수행할 수 있습니다. 이 경우 각 작업에 대해 사전 훈련된 모델 위에 이러한 추가 매개변수만 추가하므로 사전 훈련된 모델은 백본으로 가정되고 이러한 매개변수는 다른 작업의 모델에 대한 헤드로 가정될 수 있습니다.
- 치명적인 망각: 이러한 방법은 미세 조정 시 발생할 수 있는 첫 번째 작업을 망각하는 데도 도움이 됩니다.

 

(자세한 사항은 아래 링크 참조)

huggingface/peft: 🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning. (github.com)

 

GitHub - huggingface/peft: 🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.

🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning. - huggingface/peft

github.com

Parameter-Efficient Fine-Tuning using 🤗 PEFT (huggingface.co)Parameter-Efficient Fine-Tuning using 🤗 PEFT (huggingface.co)

 

GitHub - huggingface/peft: 🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.

🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning. - huggingface/peft

github.com

 

2. 전체/부분 파라미터 파인 튜닝

전체 매개변수 미세 조정에는 고유한 장점이 있습니다. 이 방법에는 도움이 될 수 있는 여러 전략이 있습니다.
- 사전 학습된 모델을 고정한 상태로 유지하고 작업 헤드(예: 분류자 모델)만 미세 조정합니다.
- 사전 훈련된 모델을 고정된 상태로 유지하고 맨 위에 몇 개의 완전히 연결된 레이어를 추가합니다.
- 모든 레이어를 미세 조정합니다.

대부분의 레이어를 고정한 상태로 유지하고 몇 개의 레이어만 미세 조정할 수도 있습니다. 다양한 기준에 따라 레이어를 고정/고정 해제하기 위해 선택할 수 있는 다양한 기술이 있습니다.

 

- 이 시나리오에서는 모델 크기에 따라 하나의 GPU 이상을 사용해야 할 수도 있습니다. 특히 모델이 훈련을 위해 하나의 GPU에 맞지 않는 경우 더욱 그렇습니다. 이 경우 Llama 2 7B 매개변수는 하나의 GPU에 맞지 않습니다. 생각해보면 모델 매개변수, 그라디언트 및 최적화 상태를 유지하려면 충분한 GPU 메모리가 필요합니다.

 

- 이들 각각은 훈련 중인 정밀도에 따라 (매개변수 수) x 정밀도(fp32 / 4바이트, fp16 / 2바이트 / bf16/2바이트 인지에 따라 다름)의 여러 배를 차지할 수 있습니다. 예를 들어 AdamW 최적화 프로그램은 각 매개변수에 대해 2개의 매개변수를 유지하며 많은 경우 이는 fp32에 유지됩니다. 이는 훈련/고정 해제 중인 레이어 수에 따라 GPU 메모리가 하나의 GPU 이상으로 커질 수 있음을 의미합니다.

 

FSDP (Fully Sharded Data Parallel)

- Pytorch에는 하나의 GPU에 맞지 않는 모델 훈련을 위한 FSDP 패키지가 있습니다.

- FSDP를 사용하면 동일한 양의 리소스로 훨씬 더 큰 모델을 교육할 수 있습니다.

- FSDP 이전에는 각 GPU가 모델의 전체 복제본을 보유하고 데이터만 분할하는 DDP(Distributed Data Parallel)가 있었습니다. 역방향 패스가 끝나면 그라디언트를 동기화합니다.


- FSDP는 데이터 샤딩뿐만 아니라 모델 매개변수, 기울기 및 최적화 상태까지 이 아이디어를 확장합니다. 즉, 각 GPU는 모델의 샤드 하나만 유지합니다. 이를 통해 동일한 수의 GPU에 훨씬 더 큰 모델을 맞출 수 있는 엄청난 메모리 절약 효과를 얻을 수 있습니다.

 

- DDP의 예를 들면, 16GB 메모리를 갖춘 GPU에 가장 많이 들어갈 수 있는 모델은 약 700M 매개변수입니다. 따라서 4개의 GPU가 있다고 가정해 보겠습니다. 이 경우 4개의 GPU에 액세스하더라도 여전히 하나의 GPU에 맞는 모델 크기 이상으로 확장할 수 없습니다. 그러나 FSDP를 사용하면 3B 모델을 4개의 GPU, > 4배 더 큰 모델에 맞출 수 있습니다.

 

 

==> (새롭게 알게 된 것)

DDP(Distributed Data Parallel)에서는 각 GPU 마다 모델 복사본을 사용하고, GPU가 N개 일 경우 전체 데이터셋을 N 등분 하여 각 GPU가 학습하게 한다. 본인은 이 부분에서 어떻게 전체 데이터를 학습하는지 의아했었다. 본 글에서 DDP는 각 GPU의 역방향 패스가 끝다면 그라디언트를 동기화 한다고 나와 있다.

 

FSDP는 DDP의 데이터만 분할하는 개념을 확장하여, 모델 매개변수, 기울기, 옵티마이저 까지 분할한다. DDP와 달리 모델 파면 하나만 유지한다. 

 

 

(자세한 사항은 아래 링크 참조)

Introducing PyTorch Fully Sharded Data Parallel (FSDP) API | PyTorch Introducing PyTorch Fully Sharded Data Parallel (FSDP) API | PyTorch

 

Introducing PyTorch Fully Sharded Data Parallel (FSDP) API

Recent studies have shown that large model training will be beneficial for improving model quality. During the last 3 years, model size grew 10,000 times from BERT with 110M parameters to Megatron-2 with one trillion. However, training large AI models is n

pytorch.org

Getting Started with Fully Sharded Data Parallel(FSDP) — PyTorch Tutorials 2.2.1+cu121 documentation Getting Started with Fully Sharded Data Parallel(FSDP) — PyTorch Tutorials 2.2.1+cu121 documentation

 

Getting Started with Fully Sharded Data Parallel(FSDP) — PyTorch Tutorials 2.2.1+cu121 documentation

Getting Started with Fully Sharded Data Parallel(FSDP) Author: Hamid Shojanazeri, Yanli Zhao, Shen Li Note View and edit this tutorial in github. Training AI models at a large scale is a challenging task that requires a lot of compute power and resources.

pytorch.org

 

 

FSDP를 통한 미세 조정 성능을 향상시키기 위해 다음과 같은 다양한 기능을 사용할 수 있습니다.

- 혼합 정밀도: FSDP의 혼합 정밀도는 Autocast에 비해 훨씬 더 유연합니다. 모델 매개변수, 버퍼 및 그라데이션의 정밀도 설정을 사용자가 제어할 수 있습니다.

- 활성화 체크포인트(Activation Checkpointing):  역방향 패스에서 다시 계산하는 데 드는 비용으로 메모리에 유지하는 대신 순방향 패스에서 중간 활성화를 삭제하여 메모리를 절약하는 기술입니다. FSDP 활성화 체크포인트는 샤드를 인식하므로 모델을 FSDP로 래핑한 후 적용해야 합니다. 우리 스크립트에서는 이를 활용하고 있습니다.

- auto_wrap_policy: FSDP가 모델을 분할하는 방법을 지정하는 방법이며 변환기 래핑 정책에 대한 기본 지원이 있습니다. 이를 통해 FSDP는 모델의 변환기 클래스를 기반으로 각 FSDP 단위(모델의 파티션)를 형성할 수 있습니다. 모델에서 이 레이어를 식별하려면 Attention 레이어와 MLP를 모두 감싸는 레이어를 살펴봐야 합니다. 이를 통해 FSDP는 통신 비용을 최적화하는 데 도움이 되는 보다 세분화된 통신 단위를 갖게 됩니다.

 


참조 사이트

- llama-recipes/docs/LLM_finetuning.md at main · facebookresearch/llama-recipes (github.com)

- Getting started with Llama 2 (meta.com) Getting started with Llama 2 (meta.com)

반응형

'LLM > Llama' 카테고리의 다른 글

[Llama-recipes] Readme.md 톺아보기  (0) 2024.03.11
Code Llama FineTune  (0) 2024.02.19
Code llama 개요  (0) 2024.02.18