llama3 - FineTunning 관련 질문입니다. (OutOfMemory)

알림
|
X

페이지 정보

작성자 나우시카 220.♡.31.18
작성일 2024.05.21 16:02
분류 질문
525 조회
1 추천
쓰기 분류

본문

파인튜닝 시도해 보는 중인데요.

(옵션이 너무 복잡해서 잘 모르고, 그냥 하라는데로 코드 복사해다 돌려 보고 있습니다.)


  1. 우선 로컬 맥북은 CUDA 환경이 아니라서, 중간 중간 오류가 나서, 이것 저것 찾아보고 바꿔봤는데 잘 안되네요. 
  2. 그래서, 구글 corab 환경에서 돌려보니 실행은 되는데, 자꾸 메모리 오류가 납니다. 
  3. 모델이야 제가 만든게 아니라서, 모델 문제는 아닌데, 보니까 학습데이터의 row 가 너무 크면 그렇더라구요. (한 row 가 5,000자 쯤 됩니다) 
    1. 5천자 너무 많은가요? 줄이면 오류는 안나는데 학습 데이터를 자르기가 애매합니다. 
    2. GPU 메모리를 늘려봐도 왼간해선 안되더라구요. 
    3. 줄일려면 얼마나 줄여야 오류가 안날까요? 안줄이고 다른 옵션을 조정해서 하는 방법은 없을까요? 
  4. 로컬 LLM 파인튜닝 좀 더 쉽게 하는 방법은 없을까요??


에러입니다.

OutOfMemoryError: CUDA out of memory. Tried to allocate 64.00 MiB. GPU 0 has a total capacity of 22.17 GiB of which 46.88 MiB is free. Process 19448 has 22.12 GiB memory in use. Of the allocated memory 21.43 GiB is allocated by PyTorch, and 479.76 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables)

제가 가져온 옵션입니다.  batch size 를 줄여보라고 해서, 4까지 줄여봐도 동일합니다.


------------------ 자답

  1. 학습 데이터가 XML/JSON 형태의 특정 포맷이라 자르기가 애매했습니다.
  2. 내부 사용하는 불필요한 ID들을 단축식으로 바꿔서 시도 -> 여전히 OutOfMemory
  3. 학습 데이터를 LLM을 통해 일반문장으로 일반화를 해서 다시 시도해봤으나 (5000자 -> 500자 정도로 줄임) 여전히 OutOfMemory
  4. PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:30000 옵션 추가 성공! 

이것저것 해보다가 얼떨결에 걸린거라, 이게 맞는건지는 모르겠으나 학습은 정상적으로 된거 같습니다. (ROW가 여전히 깁니다)




댓글 5 / 1 페이지

가꾸님의 댓글

작성자 가꾸 (168.♡.128.42)
작성일 05.21 16:12
llama3 몇을 사용하고 계신지 모르겠지만 양자화를 하고 해야 그나마 학습이 진행될 겁니다.
맥북 환경이나 어떤 환경에서 돌리고 계시는 지 몰라 불가능할지도 말씀 못 드리겠네요.
CUDA가 뭔지 맥에서는 어떤 설정으로 해야하는지 알아보시는걸 추천 드려요.

나우시카님의 댓글의 댓글

대댓글 작성자 나우시카 (185.♡.121.4)
작성일 05.21 17:01
@가꾸님에게 답글 1. 맥북에서 안되서, 구글 코랩(corab) 환경에서 돌리고 있습니다. (플러스 가입해서 A100  GPU 50G 에서 돌렸습니다.)
2. 모델 문제가 아니라, 학습 데이터가 작으면 문제 없는데, 학습데이터 ROW가 5천자가 되니, OutOfMemory 가 납니다. 갯수가 문제가 아니라, 한번에 학습하는 토큰수가 문제인 듯 싶습니다.

간실장님의 댓글

작성자 간실장 (1.♡.173.35)
작성일 05.21 19:25
한 1년전쯤 로컬에서 쿠다로 돌려본 경험입니다.
gpu는 rtx 3060 12GB였습니다.
openai의 유료 api key가 있음에도 로컬에서 시도해 본 이유는 비용이 많이 나온다는 이유에서 한 2~3달 삽질을 했습니다.

결론은 이렇게 하지 마세요..
로컬에서 제 성능 발휘하기도 힘들고, 설정 및 세팅하는 과정이 만만치 않아서 너무 고생을 했습니다.
특히 cuda와 pytouch 연결되는데.. 버전을 너무 탑니다. 버전이 살짝만 다르거나 해도 설치 오류가 너무 많이 나고..
설치가 되어도 cuda 사용시 OutOfMemoryError부터 exception이 너무 많이 나오더군요.
이렇게 고생해서 설치및 설정해도 남들 편히하는 아주 단순한 샘플 코드 돌리는 정도만 가능하지, 그이상은 진행하기도 힘들수 있습니다.
(요새는 버전이 업 되면서 조금 상황이 나을수도 있습니다..)

그럼 어떻게 하느냐..

1. 외부 서비스를 이용하자.
유료 api key를 사용해서 외부 서비스를 사용하는게 편합니다..
비싸냐.. 안 비쌉니다. 다들 초반부터 gpt-4, gpt4-turbo로 돌리려고 하는데.. 이러지 말고, gpt3-turbo를 사용해서 돌려서 코드 돌리세요. 그냥 몇달을 해도 만원도 나오기 힘듭니다.. 지금까지 $1달러는 좀 넘은 상황입니다.

gpt3-turbo는 결과값이 좋지 않냐?? 맞습니다. gpt-4보다 당연히 안 좋죠.
하지만, prompt 구성부터 embedding, RAG등을 다 구현해 놓고, gpt-4나 그 이상으로 돌리면 됩니다.
(langchain 사용하면 3곳정도 수정하면 바로 다른 모델 사용이 가능합니다.)
로컬에서는 코드 자체 돌리기도 힘들어서 gpt-4든 뭐든 결과값을 받아보기도 힘든데.. 이런 식으로는 편하게 결과값을 가져올수 있습니다.

2. jupyter notebook을 사용하자.
LLM 코드 구성시 초기에는 반드시 주피터를 사용해서 코드 구성하세요.
일반 파이썬으로 구성하지 마세요.. 이건 필수입니다.
개발 속도가 단언하는데.. 최소 2~3배 이상이 속도가 납니다.
이건 찾아보면 관련글들 많습니다..

3. langchain을 사용하자.
langchain을 사용하면 모델 변경부터 시작해서 모든 것이 편해집니다.
gpt-4o까지 올라온지는 모르겠으나, 모든 거의 모든 LLM들을 변경해서 사용이 가능합니다.
물론 그 LLM 사용시 그 모델의 유료 api key가 있으면 바로 사용이 가능합니다.
그리고, langchain 문법을 익혀야 하지만.. 막코딩하는 것보다 기간 단축이 된다고 봅니다.

이렇게 결과물 도출하고 난뒤에 로컬이든 외부 서비스든 원하는 형태로 구축하면 더 시간이 단축된다고 생각합니다.
지나가다가, 적어봅니다.. ^^;

가사라님의 댓글

작성자 가사라 (136.♡.34.101)
작성일 05.21 23:33
5000자라 너무 길어서 문제가 된다면 이걸 요약해서 짧게 만들어서 시도해보시는 것도 방법이 될 수 있습니다.
아니면, row 를 2개로 나누되 나눈 부분 기준으로 앞뒤로 중복되는 부분이 있게 나눠서 (0~6, 4~10) 연관성을 주는 것도 괜찮고요.

RaPo님의 댓글

작성자 no_profile RaPo (27.♡.253.142)
작성일 05.29 11:01
말씀하신 옵션은 메모리 제어를 하는 옵션인지라 정답입니다.
다만, 그렇게 하면 메모리에 다 올리지 못하기 때문에 학습 시간이 늘어나는 걸로 알고 있습니다.

옵션에 대한 내용은 chat gpt 답변으로 갈음합니다.

PYTORCH_CUDA_ALLOC_CONF는 PyTorch에서 CUDA 메모리 할당을 제어하기 위해 사용하는 환경 변수입니다. 이 옵션을 사용하면 CUDA 메모리 관리와 관련된 다양한 설정을 사용자 정의할 수 있습니다. 이는 GPU 메모리 사용을 최적화하고, 메모리 부족 문제를 방지하며, 성능을 향상시키는 데 도움이 됩니다.

주요 설정 옵션
PYTORCH_CUDA_ALLOC_CONF 환경 변수는 여러 설정 옵션을 콜론(:)으로 구분하여 사용할 수 있습니다. 다음은 주요 설정 옵션입니다:

max_split_size_mb:

메모리 풀의 최대 분할 크기를 지정합니다. 기본적으로 큰 블록은 작은 블록으로 나누어 관리됩니다. 이 옵션은 블록을 나누는 최대 크기를 제어합니다.
예: max_split_size_mb:128는 128MB 이하의 블록으로 분할하도록 설정합니다.
garbage_collection_threshold:

메모리 풀에서 비할당 메모리 블록의 비율이 이 임계값을 초과할 때 가비지 컬렉션을 트리거합니다.
예: garbage_collection_threshold:0.8는 비할당 메모리가 80%를 초과하면 가비지 컬렉션을 수행하도록 설정합니다.
max_block_size:

할당할 수 있는 최대 메모리 블록 크기를 지정합니다.
예: max_block_size:512M는 512MB 이상의 블록을 할당하지 않도록 설정합니다.
쓰기 분류
홈으로 전체메뉴 마이메뉴 새글/새댓글
전체 검색