안녕하세요.

브리아나입니다.

 

오늘은 LLM 학습이나 fine-tuning시 필요한 필수 라이브러리에 대해서 소개해보고자 합니다.

 

✅ accelerate

 

Accelerate는 PyTorch 기반 모델의 학습(Training)과 추론(Inference)를 최적화하는 HuggingFace에서 만든 라이브러리입니다.

특히, 분산 학습(multi-GPU, TPU), 혼합 정밀도 학습(Mixed Precision Training), 메모리 최적화를 지원해 대규모 모델 학습을 효율적으로 만듭니다.

대게의 LLM 모델은 메모리 요구량이 매우 커서, accelerate는 단일 GPU or 다중 GPU 환경에서 학습 속도 높이면서 메모리 사용량 줄이는데 유용한 라이브러리입니다. 

 

내부적인 주요 기능은 다음과 같습니다.

  • Zero Redundancy Optimizer (ZeRO): 모델 파라미터, 옵티마이저 상태, 그래디언트를 GPU 간에 분할해 메모리 사용량 감소.
  • Mixed Precision: FP16/BF16 사용해 계산 속도 높이면서 메모리 사용량 줄인다.
  • Dynamic Padding: 배치 크기를 동적으로 조정해 효율성 높인다.

 

PEFT

 

peft(Parameter-Efficient Fine-Tuning)은 대규모 언어 모델(LLM)을 적은 파라미터로 미세 조정하는 기술로 HuggingFace에서 제공하는 라이브러리입니다.

대표적으로 LoRA(Low-Rank Adaption)과 QLoRA(Quantized LoRA)를 지원합니다.

대게 Fine-tuning 하고싶을 때, 모델 자체가 너무나도 대규모이기 때문에 모든 파라미터를 학습하는 Full Fine-tuning은 메모리 소모가 큽니다.

PEFT는 LoRA/QLoRA를 통해서 효율적인 미세조정이 가능하게 합니다.

 

💜 LoRA: 저차원 행렬(A, B)를 추가해 소량의 파라미터만 학습해요. 예) 7B에서 수백만으로 줄임.

💜 QLoRA: 4비트 양자화(Quantization)을 적용해 메모리 사용량을 추가로 줄여요.

💜 Adapters: 학습된 어댑터를 기존 모델에 병합(Merge) 하거나 분리도 돼요.

 

+ HuggingFace 말고도 torchtune 이라는 라이브러리가 있는데, 거기서는 lora_finetune_single_device, qlora_finetune_single_device 등의 라이브러리로도 동작 가능해요!

 

 

 Bitsandbytes

 

모델 파라미터를 4비트 혹은 8비트로 양자화해서 메모리 사용량을 줄이는 라이브러리입니다.

  • LLaMa-7B는 FP16으로 14GB 메모리 필요해요.
  • 그러나, bitsandbytes 사용해서 4비트 양자화(NF4)로 변환하면 8GB 이하로 학습 가능해요.

지원 가능한 기능은 다음과 같아요.

  • 4-bit/8-bit Quantization
  • NF4 (NormalFloat 4-bit): 보통 QLoRA에서 사용하는 특수 데이터 타입으로, 정밀도 손실을 최소화해요.
  • Dynamic Quantization: 학습 중 가중치를 디-퀀타이징해서 계산 정확도를 유지해요.

 

 

 

Grounding DINO 이해하기

 

 

Title

Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection

https://arxiv.org/pdf/2303.05499

 

Introduction

 

많은 검출(Deteciton)모델은 사전에 준비된 데이터 한정으로만 학습이 진행되는데, 여기서 문제는 확장성 제한에 따른다. 인식해야할 물건이 바뀌거나 더 넓은 범주의 Detection을 하려면 1) 데이터 새로 모으고, 2) 레이블링 하고, 3) 모델 다시 학습하는 과정이 따른다. 4) 금액도 많이 들고, 5) 시간도 오래 소요되는것은 물론이다.

 

Zero-Shot Detector 는 재학습없이 새로운 물체도 인식될 수 있도록 되기를 원했고, 사용자가 입력한 prompt를 기반으로 찾게 되는 것을 의미한다.

 

Grounding DINO는 현재 zero-shot 객체 검출 모델에서 SOTA이다.

(왼) Prompt: 의자, (오) Prompt: 강아지 꼬리

 

사용자가 준 Prompt를 기반으로 객체를 잘 검출하는 것으로 보인다.

 

 

Grounding DINO의 Architecture

Grounding DINO는 기존 DINO와 GLIP 논문에서 결합된 아이디어이다.

DINO: Transformer 기반의 Detection 방법, NMS와 같은 후처리 기법이 제거된 방법
GPIP: text가 주어지고 거기에 대응되는 시각적 요소의 문맥을 이해하는 방법

 

1. Text Backbone and Image Backbone

- Image Backbone: Swin Transfomer (Multi-scale 이미지 feature extractor) 로 더욱 풍부한 이미지 feature 생성

- Text Backbone: BERT로 텍스트 feature 생성

위 그림처럼 text는 text backbone에서 추출하고, image는 image backbone에서 각자 추출한다.

 

 

 

2. Feature Enhancer

 

1번 과정에서 feature가 각각 추출이 되면 멀티 모달 피쳐 통합 과정을 위해 featrue enhancer로 전달된다.

Feature Enhancer는 복수개의 feature enhancer 레이어로 구성된다.

Deformable self-attention은 이미지 피쳐를 향상시키는데 활용되고, vanilla self-attention은 텍스트 피쳐를 향상시키는데 활용된다.

 

 

 

3. Language-guided query selection

 

물체 검출에 text 입력값을 제대로 가이드 시켜주기 위해서는, language-guided query selection module이 디코더 쿼리단에서 입력 테스트가 더 관련있는 feature로 selection될 수 있게 설계됐다.

 

 

 

4. Cross-modality Decoder

 

cross-modality decorder는 이미지랑 텍스트 feature 결합하는 기능으로 구성되어지는데,

3번의 query selection으로 부터 나온 각각의 cross-modality 쿼리들이 self-attention layer로 전달된다.

다음으로 image feature는 "image cross-attention"에서 결합하고, text feature는 "text cross-attention"에서 결합한다.

마지막으로, cross-modality 디코에 레이어에서 FFN layer으로 입력된다.

각각의 decorder 레이어는 기존 DINO 디코더 레이어와 달리 추가적인 text cross-attention 레이어가 있는데, 더욱 정교한 정렬 과정을 위해서 텍스트 정보를 쿼리에 삽입해야한다.

 

 

결론은 간단히 정리되어있는데, 정교하다는 장점이 있지만 느리다는 단점이 있고, 

실시간 검출로는 아직까지는  YOLO가 더 낫고, 실시간이 아니라면

GroundingDINO나 낫다라는 결론이 정리되어있습니다. 

 

 

본 글은 (https://blog.roboflow.com/grounding-dino-zero-shot-object-detection/) 사이트를 참조해 요약하였습니다.

 

 

+ 추가 Summary.

 

1. architecture에서 그림이 잘 이해가 안된다.

 

어린 아이에게 농장 동물에 대해서만 가르친 다음에, 펭귄같은 동물에 보여주면 어떻게될까?

 

 

혼란스러워 할 예측을 딥러닝 세계에서도 동일하게 반영되며, 이것을 "Closed-world Assumption"이라고 한다.

 

딥러닝도 마찬가지로 테스트셋이 훈련 데이터와 유사한 분포를 가진 데이터이면 괜찮겠지만, 실제로는 그렇기 힘들다. 훈련 데이터와 다른 분포를 가지는 real-world의 데이터로(여기서는, Out-of-distribution) OOD Detection이 등장하게 되었다.

 

 

OOD Detection을 잘 해야하는 이유로, 실제로 real-world는 방대한 양으로 인해 training 에 포함되지 않은 이상 현상이 있을 수 있고, 실제로 약을 잘 못 찾아 잘못된 치료법을 제공한다던지 집 로봇이 이상 행동을 한다든지 등을 야기할 수 있다.

그래서 OOD Detection이 중요하다.

 

 

그래서, OOD 사례를 일반화하고 이해 범위를 넘어서는 통찰력을 가지는 역할이 중요하다.

 

 

AI 모델이 OOD 데이터에 취약한 이유,

  • Model Complexity(모델 복잡성): 모델 네트워크는 매우 파라미터화 되어있고, 훈련데이터 내 복잡한 패턴에 fitting된다. 이러한 복잡성이 in-distribution 데이터에는 높은 정확도를 가지게하는 반면, OOD는 취약해진다. 모델은 OOD 입력의 분포가 훈련데이터 분포랑 다르더라도 자신있게 반응을 할 수 있는것도 문제가 될 수 있다.
  • Lack of Regularization(정규화 부족): Dropout 기법이나 Weight decay 등의 정규화 기법은 모델의 일반화 성능을 향상시킬 수 있기는 하지만, 모델은 여전히 훈련 데이터에 오버피팅된다.
  • Dataset Shift(데이터셋 변화): 실제로는 시간이 지남에 따라 데이터 분포가 언제든지 변할 수 있다.
  • Model Assumptions(모델 가정): 보통 모델들은 가정을 하게 되는데, OOD 데이터가 가정을 위반한다면 성능이 저하된다.
  • High Dimensionality(고차원): 차원의 저주(the curse of dimensionality)도 역할이 될 수 있다. 데이터가 볼륨으로 갈수록 표면 정보도 생기면 더욱 훈련 데이터에 fitting될 수 있다.
  • 등등등(거의 다 유사한 얘기)

 

OOD Detection 접근 방법,

  • Maximum Softmax Probability(최대 소프트맥스 확률값): 보통 예측을 하면 훈련 데이터에 in-distribution된 데이터는 높은 softmax probability를 가질거고, ood 데이터는 낮은 softmax probability를 갖게 될텐, 이 확률값을 기반으로 threshold로 셋팅해 일정 값 이하는 OOD 객체로 간주할 수 있다. 
  • Ensembling of Multiple Models(여러 모델의 앙상블): 한가지 모델의 예측값에 대해서 의존하지 않고 여러 모델의 예측값을 결합해서 집단적으로 결정을 내리면 더욱 OOD 데이터를 잘 식별할 수 있다.
  • Temperature Scaling(온도조정): 후처리 기법인데, 모델 결과물(softmax)를 보정(calibration)한다. "temperature" 파라미터를 조정해서 모델 예측 확률값을 수정할 수 있다. 적절하게 보정된 모델은 OOD 데이터를 더욱 정확하게 감지할 수 있다.
  • Training a Binary Classficiation Model as a Calibrator(보정 역할로 이진 분류 모델 훈련): 다른 접근법으로 보정 역할을 하는 이진 분류기를 학습하는 것이다. OOD데이터인지 in-distribution 데이터인지. 주요 모델의 output으로 이 보정 분류 모델에 넣으면, in distribution인지 OOD인지 정확히 알 수 있다.
  • Monte-Carlo Dropout(몬테까를로 드랍아웃): 일반적으로 dropout은 일반화 기법으로 흔하게 쓰이는데, 몬테까를로 dropout은 인퍼런스때와 수행하고 모델을 여러번 실행하는 방법이다. 이런 방법으로 모델의 output 분포로 모델의 불확실성을 추정하는데 이때, OOD 감지에 사용된다.

 

Furue Direction(미래 연구 방향),

  • Enhanced Generalization(향상된 일반화): 모델이 더욱 복잡해짐에 따라서, OOD 데이터에 대해서도 일반화 할 수 있는지 확인하는게 중요하다. 
  • Integration with Other AI Domains(다른 AI 도메인과의 통합): Transfer learning, few-shot learning, 등과 같이 다른 AI도메인 통합되어 더욱 강력하고 적응가능한 시스템이 되는 방향.
  • Real-time OOD Detection(실시간 OOD 감지): 자율주행이나 의학진단 등에 중요하게 사용될 것. 정확성 잃지 않되 더욱 빠르게 감지할 것
  • Ethical Considerations(윤리적 고려): 

 

 

 

refer:  https://encord.com/blog/what-is-out-of-distribution-ood-detection/

안녕하세요

브리아나입니다.

 

오늘은 Python 에서 프로젝트에 맞는 가상환경을 새로 생성해주려고 하는데요!

새로운 프로젝트가 생길 때 마다 가상환경을 가장 먼저 만드는데 

가장 설레면서도 가장 두려운 작업 중 하나입니다.

(버전 문제로 충돌이 일어나거나 그러면 또륵..)

 

Anyway, 그럼 아나콘다 환경에서 가상 환경을 생성하는 명령어, 삭제하는 명령어 등에 대해서 알아보겠습니다.

 

 

1. 가상환경 생성

conda create -n env_name_here python=3.8

콘다야~ 나 만들건데, 이름은 env_name_here 이렇게 만들어주고 그 안에는 python3.8로 설치해줘~

라고 하는 명령어 인데요!

이름은 본인이 하고싶은거 알아서 정하시면 됩니다.

메인으로 설치하고자 하는 라이브러리들이 파이썬의 어떤 버전과 호환이 잘 되는지도 사전에 확인해주시면 좋구요

torch cuda 이런거 골치 아프자나요~~ ㅎㅎ

 

2. 가상환경 조회

conda info --envs

위 명령어는 내 컴퓨터 안에 어떤 환경들이 구축되어있는지 조회하는 방법인데요!

실력이 늘어가면서 가상환경수가 많아지면 이름이 간혹 헷갈릴때가 있는데요!

특히나 

yolo_cpu

yolo_gpu

저는 프로그램 별로도 명확한 라이브러리 충돌 문제를 빠르게 해결하기 위해서

환경을 각각 관리하고 있어서 더욱 여러개의 가상환경을 관리하고 있습니다.

 

3. 가상환경 삭제

conda remove -n env_name_here --all

만들어두었던 가상환경을 깔끔하게 제거하는 방법입니다.

잘 제거 되었는지는 2번의 명령어를 통해 확인할 수 있겠죠 ?

 

그럼 모두 아나콘다와 친해지세요 ㅎㅎ 

+ Recent posts