목적
Llama 2를 다음 환경에서 작동 시키는 것을 목표로 한다.
- OS: Ubuntu 22
- GPU: Nvidia 3090 TI 24GB
- Container: tensorflow/tensorflow:latest-gpu-jupyter
여기에 --cpuset-cpus를 사용해서 cpu의 사용량을 제한시켰다 만약 cpu로 모델이 동작할 경우, 호스트의 모든 리소스를 점유하는 상황이 생길 수 있다.
docker run --gpus all --cpuset-cpus="0-3" -d -it --rm -v <local volume path>:/tf/notebooks -p 8888:8888 tensorflow/tensorflow:latest-gpu-jupyter
- Python version: 3.9
전제 사항
- 우분투 22와 도커가 설치 되었다.
- Nvidia GPU가 도커상에서 작동 하는 것이 확인 되었다.
2024.03.31 - [AI] - [AI] Ubuntu 22 Nvidia GPU Docker로 연동하기
- hugging face에 로그인 할 수 있다.
실행 순서
hugging face Llama 등록
https://huggingface.co/meta-llama/Llama-2-7b-hf
에 접근 후 사용 등록을 요청한다.
위와 같은 화면이 나오면 Submit을 누르고 영어로 이름, 성 그리고 주소를 입력하면 된다.
마지막으로 소속을 작성하면 되는데, 개인 공부로 할 예정이라 Indpendent라고 작성 하였다.
어떤 사람들은 하루가 걸린다고 하는데, 본인은 30분이내에 다음과 같이 사용 가능 메일이 도착하였다.
Meta original Model (Not preferred)
https://llama.meta.com/llama-downloads
메타에 사용권한 등록을 한후 시간이 지나면 메일함에
위와 같이 모델을 사용해도 좋다는 메일이 오게 된다.
이때 24시간만 사용가능한 url이 오는데, 이 url을 https://github.com/meta-llama/llama 에 있는 ./download.sh 를 이용해서 다운로드 할 수 있다.
본인은 여기를 통해서 다운받은 파일을 이용해서 로컬 실행을 하려고 했으나 실패 했다. 파이토치용 파일로 나온거 같은데, example을 봐도 복잡한게 많아서 그냥 hugging face를 이용해서 로컬 실행 시키기로 하였다.
주피터 노트북 생성
위와 같이 llama2origin이라고 하는 주피터 노트북을 생성하자.
Dependency Download
!pip install torch peft huggingface_hub accelerate
!pip install git+https://github.com/huggingface/transformers
!pip install -i https://pypi.org/simple/ bitsandbytes
Class Import
from huggingface_hub import HfApi, list_models, login
from transformers import LlamaForCausalLM, LlamaTokenizer, BitsAndBytesConfig
from accelerate import Accelerator
GPU를 활용하려면 Accelerator는 필수적이다.
Hugging Face
login()
위와 같이 웃고 있으면 Token을 넣어 주고 Login을 누르자
조금더 쉬운 방법으로는 다음과 같이 하는 것도 된다.
import os
from huggingface_hub import login
login(token="토큰을 여기에")
Token 발행
https://huggingface.co/ 로 가서 Settings를 선택한다
여기서 Access Tokens를 선택하고 New Token 버튼을 클릭해서 토큰을 생성해서 사용하자.
모델 로드
base = 'meta-llama/Llama-2-7b-chat-hf'
tokenizer = LlamaTokenizer.from_pretrained(base)
tokenizer.pad_token_id = 0
tokenizer.padding_side = "left"
quantization_config = BitsAndBytesConfig(load_in_8bit=True,llm_int8_threshold=200.0)
model = LlamaForCausalLM.from_pretrained(
base,
quantization_config=quantization_config,
device_map=accelerator.device,
)
이렇게 하면
이렇게 로드가 잘 되면 된다. model을 생성할때 생각보다 이런 저런 오류가 많이 나지만 2024년 4월 기준으로는 위의 Dependency와 코드로 잘 작동이 된다. 만약 디펜던시 오류가 계속 발생한다면,
커널을 리스타트 해보자.
nvidia-smi
여기까지 문제없이 로드 되었다면, 아래와 같이 우분투에서 해당 모델이 적제 된것을 확인 할 수 있다.
~/python/notebooks$ nvidia-smi
Sun Apr 14 21:37:12 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.15 Driver Version: 550.54.15 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 3090 Ti Off | 00000000:01:00.0 On | Off |
| 0% 48C P8 28W / 450W | 7487MiB / 24564MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| 0 N/A N/A 2480 G /usr/lib/xorg/Xorg 80MiB |
| 0 N/A N/A 2627 G /usr/bin/gnome-shell 72MiB |
| 0 N/A N/A 5340 G gnome-control-center 4MiB |
| 0 N/A N/A 18306 C /usr/bin/python3 7302MiB |
+-----------------------------------------------------------------------------------------+
Pid 18306에 모델이 올라가 있다
Prompt 작성 및 테스트
prompt = "What is your name?"
inputs = tokenizer(prompt, return_tensors="pt")
generate_ids = model.generate(inputs.input_ids.to('cuda'), max_length=50)
tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
위와 같이 프롬프트를 작성하고 model.generate를 함으로써 답변을 요청할 수 있다.
주의 해야할 것은 gpu의 경우 input_ids.to('cuda')를 꼭 해줘야 한다. 아니면 cpu작동을 하게 된다.
이렇게 답변이 나오면 로컬에 Llama를 간단하게 작동시키는데 성공한 것이다.
'AI' 카테고리의 다른 글
Llama 2 Download Error (416 Requested Range Not Satisfiable) (0) | 2024.04.14 |
---|---|
[AI] Ubuntu 22 Nvidia GPU Docker로 연동하기 (0) | 2024.03.31 |
Sum of the squared errors (0) | 2021.08.01 |
Predicting Student Admissions with Neural Networks (0) | 2021.08.01 |
Backpropagation (0) | 2021.08.01 |