LLM 파인튜닝 도구 XTuner, Llama-3 기반 LLaVA 모델 공개

:pytorch:PyTorchKR:kr:

Llama-3 모델이 공개되며 많은 곳에서 다양한 방식으로 파인튜닝 및 활용을 하고 계신데요, 이번에는 대규모 언어 모델(LLM) 파인튜닝 도구 XTuner에서 Llama-3-8B-Instruct 모델을 기반으로 한 LLaVA-Llama-3-8B 모델과 LLaVA-Llama-3-8B-v1.1을 공개한 것이 눈에 띄어 가져와봤습니다. :star_struck:

LLM 파인튜닝 도구 XTuner, Llama-3 기반 LLaVA 모델 공개


LLM 파인튜닝 도구 XTuner, Llama-3 기반 LLaVA 모델 공개

XTuner 소개

XTuner는 Gemma, Mixtral 8x7B, Llama2를 비롯하여 InterLM2Qwen 등과 같은 다양한 LLM들을 지원합니다. 파인튜닝 방식 또한 전체 파인튜닝 외에도 LoRA/QLoRA과 같은 매개변수 효율적인 파인튜닝(PEFT, Parameter Efficient FineTuning) 기법들을 지원하며, 다양한 데이터셋과 파이프라인을 지원하는 도구입니다. XTuner의 주요 기능들은 다음과 같습니다:

XTuner의 주요 특징

다양한 모델 지원

XTuner는 InternLM, Llama, Baichuan, Qwen, ChatGLM 등 다양한 대규모 언어 모델(Large Language Models, LLM)과 비주얼 언어 모델(Vision-Language Models, VLM)을 지원합니다. 이는 사용자가 필요에 따라 선택할 수 있는 폭넓은 옵션을 제공하며, 특정 프로젝트 요구에 맞게 모델을 선택할 수 있게 합니다. GitHub 페이지에 공개된, 현재까지의 지원 LLM들은 다음과 같습니다:

고성능 연산 지원

XTuner는 FlashAttention과 Triton과 같은 고성능 연산자를 자동으로 사용하여 모델 훈련의 효율을 극대화합니다. 이 기능은 특히 대규모 데이터셋을 처리할 때 시간과 자원을 절약하면서도 높은 처리량을 달성할 수 있게 도와줍니다.

DeepSpeed 통합

DeepSpeed:rocket:와의 통합을 통해, XTuner는 다양한 최적화 기술을 쉽게 활용할 수 있습니다. ZeRO 최적화 기법을 포함한 DeepSpeed의 기능은 메모리 사용량을 줄이면서도 모델 성능은 유지하게 해줍니다. 이를 통해 더 큰 모델을 더 적은 자원으로 효과적으로 학습시킬 수 있습니다.

유연한 데이터 파이프라인

XTuner는 다양한 형식의 데이터셋을 지원하는 잘 설계된 데이터 파이프라인을 제공합니다. 이 기능은 사용자가 오픈 소스 또는 맞춤형 데이터 형식을 자유롭게 사용할 수 있도록 하여, 더욱 유연한 데이터 처리가 가능하게 합니다.

다양한 미세 조정 전략

XTuner는 QLoRA, LoRA, 전체 매개변수 미세 조정(full-parameter fine-tune)과 같은 여러 가지 미세 조정 알고리즘을 지원합니다. 이를 통해 사용자는 프로젝트의 특성에 맞게 가장 적합한 미세 조정 전략을 선택할 수 있습니다.

다양한 미세조정 데이터셋 제공

XTuner는 또한 SFT(Supervised Fine-Tuning)을 위한 다양한 데이터셋들을 제공하고 있습니다:

LLaVA 소개

LLaVA는 이미지와 텍스트를 입력으로 받는 멀티모달 대규모 언어 모델(Multimodal LLM)으로, LLM에 Visual Encoder를 추가하고 파인튜닝하는 Visual Instruction Tuning 기법으로 LLM을 VLM(Vision-Language Model)으로 바꾸는 방법을 제시하였습니다.

LLaVA의 주요 특징

멀티모달 학습 능력

LLaVA 모델은 이미지와 텍스트를 동시에 처리할 수 있는 멀티모달 학습 능력을 가지고 있습니다. 이를 통해, 시각적 컨텍스트가 포함된 자연어 처리 태스크를 더 효과적으로 수행할 수 있습니다.

유연한 아키텍처

LLaVA 모델은 다양한 사전 훈련 및 미세 조정 전략을 지원하여, 특정 응용 프로그램의 요구사항에 맞게 모델을 맞춤 설정할 수 있습니다. 예를 들어, LLaVA 모델은 Full LLM과 LoRA ViT와 같은 특정 전략을 사용하여 미세 조정을 수행할 수 있습니다.

고성능 및 최적화

LLaVA 모델은 고성능 컴퓨팅 환경에서 효율적으로 운영될 수 있도록 설계되었습니다. CLIP과 같은 비주얼 인코더와 함께 사용되며, 이는 모델이 높은 정확도와 빠른 추론 속도를 제공할 수 있게 합니다.

LLaVA-Llama-3 모델 상세

XTuner에서 공개한 두 모델 모두 Meta에서 공개한 Llama-3-Instruct 모델을 기반으로 Visual Instruction Tuning을 진행하였습니다:

  • LLaVA-Llama-3-8B 모델은 LLaVA 논문에서 제안했던 LLaVA-PT 데이터셋(558K)으로 사전 학습(Stage-1) 후, LLaVA-Mix 데이터셋(665K)으로 파인튜닝(Stage-2)을 진행하였습니다.

  • LLaVA-Llama-3-8B-v1.1 모델은 LLaVA-Llama-3-8B 모델과 동일한 구조를 가지나, 사전 학습 시에는 ShareGPT4V-PT 데이터셋(1246K)을, 파인튜닝 시에는 InternVL-SFT 데이터셋(1268K)을 사용하였습니다.

Model Visual Encoder Projector Resolution Pretraining Strategy Fine-tuning Strategy Pretrain Dataset Fine-tune Dataset
LLaVA-v1.5-7B CLIP-L MLP 336 Frozen LLM, Frozen ViT Full LLM, Frozen ViT LLaVA-PT (558K) LLaVA-Mix (665K)
LLaVA-Llama-3-8B CLIP-L MLP 336 Frozen LLM, Frozen ViT Full LLM, LoRA ViT LLaVA-PT (558K) LLaVA-Mix (665K)
LLaVA-Llama-3-8B-v1.1 CLIP-L MLP 336 Frozen LLM, Frozen ViT Full LLM, LoRA ViT ShareGPT4V-PT (1246K) InternVL-SFT (1268K)

성능 비교

Llama-3 기반 LLaVA 모델들과 LLaVA-1.5-7B 모델의 성능 비교

Model MMBench Test (EN) MMBench Test (CN) CCBench Dev MMMU Val SEED-IMG AI2D Test ScienceQA Test HallusionBench aAcc POPE GQA TextVQA MME MMStar
LLaVA-v1.5-7B 66.5 59.0 27.5 35.3 60.5 54.8 70.4 44.9 85.9 62.0 58.2 1511/348 30.3
LLaVA-Llama-3-8B 68.9 61.6 30.4 36.8 69.8 60.9 73.3 47.3 87.2 63.5 58.0 1506/295 38.2
LLaVA-Llama-3-8B-v1.1 72.3 66.4 31.6 36.8 70.1 70.0 72.9 47.7 86.4

모델 사용 방법

필요 라이브러리 설치

먼저 필요한 라이브러리와 환경을 설정합니다. Python 환경에서 작업을 진행하며, 다음과 같은 명령어를 사용하여 필요한 패키지를 설치할 수 있습니다:

pip install 'lmdeploy>=0.4.0'
pip install git+https://github.com/haotian-liu/LLaVA.git

모델 불러와서 사용하기

모델을 로드하고 초기 설정을 구성하는 과정은 다음과 같습니다. 이 예에서는 lmdeploy 라이브러리를 사용하여 채팅 기능을 구현하는 방법을 보여줍니다:

from lmdeploy import pipeline, ChatTemplateConfig
from lmdeploy.vl import load_image

# 모델과 채팅 템플릿을 설정
pipe = pipeline('xtuner/llava-llama-3-8b-v1_1-hf',
                chat_template_config=ChatTemplateConfig(model_name='llama3'))

# 이미지 로드
image = load_image('https://raw.githubusercontent.com/open-mmlab/mmdeploy/main/tests/data/tiger.jpeg')

# 이미지 설명 요청
response = pipe(('describe this image', image))
print(response)

위 코드에서 pipeline 함수는 LLaVA-Llama-3-8B-v1.1 모델을 로드하고, 멀티모달 입력을 처리할 수 있도록 설정합니다. load_image 함수는 주어진 URL에서 이미지를 로드하고, pipe 객체는 이미지와 관련된 질문을 모델에 전달하여 모델이 주어진 이미지를 설명하게 합니다.

더 읽어보기

XTuner GitHub 저장소

LLaVA-Llama-3-8B 모델

LLaVA-Llama-3-8B-v1.1 모델

Llama-3-8B-Instruct 모델

v1.1 모델에 사용한 Dataset들

LLaVA 프로젝트 홈페이지




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:kr:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:gift: 아래:arrow_lower_right:쪽에 좋아요:heart:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

6개의 좋아요

안녕하세요. 오랜만이네요.
요즘 LLaVA 학습 돌려보고 있었는데요(데이터 파일 부재로 진행에 차질이 있긴 하지만요. ^^;), 혹시 이 모델 자체에 XTuner 파인튜닝 방식이 이미 적용되어있는건가요? 참고로 LoRA 파인튜닝으로 진행하고 있었습니다.

저는 원본 LLaVA 저장소를 기준으로 사용하고 있어서, 해당 저장소의 scripts/v1_5/ 내의 pretrain & finetuning 스크립트를 활용하고 있습니다. :smiley:


이 글에서 소개하고 있는 XTuner는 별도로 LLM 파인튜닝을 위한 도구로, 아래 페이지를 살펴보니 LLaVA를 pretrain & finetuning하기 위한 데이터셋 다운로드부터 학습 / 파인튜닝 등을 위한 예시 코드는 제시가 되어 있는 것처럼 보이네요.

저도 이 글에서 소개만 하고 사용해보지는 않았는데, 혹시나 XTuner를 사용하여 LLaVA 공식에서 지원하지 않는 (Mistral/Vicuna-7B / Hermes-Yi-34B 외의) LLM을 기반으로 Multimodal LLM을 파인튜닝하시게 되면 후기 부탁드립니다. :smiley:

1개의 좋아요

사실 LLaVA에서 기본으로 제공했던 모델 중 하나를 pretrain으로 설정하고 LoRA 파인튜닝을 진행했더니 CUDA out of memory 문제가 떴던 기억이 있네요.

LLaVA/docs/MODEL_ZOO.md at main · haotian-liu/LLaVA (github.com)
여기에서 llava-v1.5-7b-lora로 진행했던 것 같아요.

그럼 혹시 이보다 더 작은 모델로 진행해보면 될까요? 물론 제가 직접 해봐야겠지만요.

혹시 정보가 부족하다고 느끼신다면 제 서버 환경 등 더 자세하게 설명드리겠습니다.

OOM 문제라면 말 그대로 VRAM 문제라서, 선택해보실 수 있는 방법이 제한적일 것 같습니다. 일단 기존 LLaVA 모델을 가지고 추론(inference)를 한 번 해보시면서, 사용하시는 GPU에 해당 모델이 올라갈 정도인지를 먼저 확인해보시는게 좋을 것 같습니다.

모델이 안 올라갈 정도라면 여유가 있으시면 GPU 서비스를 하는 서버들에서 한 번 시도해보셔서 원하시는 결과가 나올만한지를 먼저 살펴보시는게 좋을 것 같구요, 어려우시다면 먼저 ZeRO쪽 config를 바꿔보시고, QLoRA 등의 방법을 사용해보시는 식으로 시도해보시는 것을 추천드립니다.

LLaVA 기본 설정으로는 ZeRO3 Config를 사용하고 있고, 메모리 부족 시에 zero3_offload.json 등을 시도해볼 것을 권하고 있습니다.

We provide sample DeepSpeed configs, zero3.json is more like PyTorch FSDP, and zero3_offload.json can further save memory consumption by offloading parameters to CPU. zero3.json is usually faster than zero3_offload.json but requires more GPU memory, therefore, we recommend trying zero3.json first, and if you run out of GPU memory, try zero3_offload.json . You can also tweak the per_device_train_batch_size and gradient_accumulation_steps in the config to save memory, and just to make sure that per_device_train_batch_size and gradient_accumulation_steps remains the same.

1개의 좋아요

더 작은 모델을 시도해보시려면, LLaVA의 방법론을 더 작은 모델(Phi-2.5 등)에 적용한 Imp 같은 모델이나 Gemma를 기반으로 한 PaliGemma 같은 모델 등이 있으니 참고해보시는 것도 방법일 것 같습니다.

그 외에도 TinyGPT-V 등이 있긴 하지만, 아무래도 학습 스크립트까지 잘 갖춰진 Open Weight 모델들을 찾으시는게 나으실 것 같아 위 2개 모델을 먼저 추천드립니다. :smiley:

1개의 좋아요

좋은 참고 자료가 되겠네요. 감사합니다!
일단 훈련 배치 크기를 디폴트인 16에서 4로 낮췄더니 학습 돌아가는건 확인했습니다.

참고로 1시간 정도 되어서 갑자기 뜬금없이 데이터 하나가 없어서 중단되는 일이 벌어지긴했습니다만, LLaVA가 잘 되는지 확인하는게 목표여서 큰 문제가 되지는 않을 듯 합니다!