Lina's Toolbox

llama 이용하기 본문

스파르타 내일 배움 캠프 AI 웹개발 과정/AI

llama 이용하기

Woolina 2024. 9. 5. 21:44

gpt는 폐쇄적이다.

내 컴퓨터에 gpt 모델 자체를 다운받아서 하는게 아니라

요청할 때마다 서버와 통신한다.

 

이때의 문제점은, 내 개인적인 정보를 프롬프트에 입력했을때

입력한 개인 정보가 서버로 전송되면,

gpt가 프롬프트 데이터를 학습하면서 사용하면서

나의 기밀한 개인정보가 유출될 수 있다는 보안 우려가 생길 수 있다.

 

반면, Meta의 오픈소스 Llama 같은 모델은

컴퓨터에 직접 다운로드해서 사용할 수 있다.

이렇게 하면 모든 데이터 처리가 로컬에서 이루어져서 외부 서버로 정보가 전송되지 않으므로

보안적으로 더 유리하다.

 

하지만 말 그대로 Large Language Model 이므로, 용량이 매우 크다.

내 컴퓨터에 llm을 직접 다운받아야 하는데,

cpu로 돌려야하는 상황이라면 매우 느리다.

gpu를 사용하도록 하는 방법도 있겠지만 이건 오늘 다루지 않겠다.


1. Hugging face에 가입한다. 

허깅페이스는 오픈소스 기계 학습 커뮤니티이다.

https://huggingface.co/ 

 

Hugging Face – The AI community building the future.

The Home of Machine Learning Create, discover and collaborate on ML better. We provide paid Compute and Enterprise solutions. We are building the foundation of ML tooling with the community.

huggingface.co

 

2. 모델 페이지로 이동한다.

https://huggingface.co/meta-llama/Llama-2-7b

 

meta-llama/Llama-2-7b · Hugging Face

The information you provide will be collected, stored, processed and shared in accordance with the Meta Privacy Policy. LLAMA 2 COMMUNITY LICENSE AGREEMENT "Agreement" means the terms and conditions for use, reproduction, distribution and modification of t

huggingface.co

 

3. 모델 접근을 요청한다.

모델 페이지에서 Expand to review and access를 클릭한다.

 

개인정보를 입력해준다.

Affiliation은 아무거나 입력해도 상관없다.

None으로 입력해도 문제 없이 허가됨.

 

동의 누르고 Submit버튼을 눌러준다.

 

그리고 보통 10분~1시간 정도 기다리면 허가가 되었다는 메일이 온다.

그때부터 이 모델을 사용 가능하다!

 

🚨 반드시 이메일 인증을 마쳐야지 허가를 받을 수 있다!

 

4. 토큰을 발급받자.

토큰 페이지로 이동하여 토큰을 생성하자.

https://huggingface.co/settings/tokens

 

Hugging Face – The AI community building the future.

 

huggingface.co

 

토큰 이름은 자유롭게 입력하고 (나는 내 가상환경과 같은 이름으로 해줬다.)

다음 세 항목은 체크해준 후,

하단에 Create Token 버튼 클릭!

 

그러고 나서 발급된 토큰 키를 복사할 수 있는 화면이 보이는데,

이 화면은 인생에 단 한번만 볼 수 있으니

토큰 키는 복사하여 잘 보관해두도록 하자.

 

 

5. 토큰 설정 변경

기다림 끝에 이 메일을 받았다면, 모델 접근 허가가 된 것이다!!

 

 

모델 접근 허가가 완료되었다면

내 토큰 설정에서 원래 아무것도 안뜨던 Repositories permissions에서

llama모델을 설정할 수 있도록 바뀌었을 것이다!

llama를 찾아 선택해 준 후, 아래 세 항목도 체크해준다.

 

 

6. 패키지 다운로드

그리고 내 가상환경 터미널에서, 패키지를 다운받아준다.

pip install transformers accelerate sentencepiece

 

Package            Version
------------------ ---------
accelerate         0.34.0
certifi            2024.8.30
charset-normalizer 3.3.2
click              8.1.7
filelock           3.15.4
fsspec             2024.9.0
huggingface-hub    0.24.6
idna               3.8
Jinja2             3.1.4
libretranslatepy   2.1.1
lxml               5.3.0
MarkupSafe         2.1.5
mpmath             1.3.0
networkx           3.3
numpy              2.1.1
packaging          24.1
pip                24.2
psutil             6.0.0
PyYAML             6.0.2
regex              2024.7.24
requests           2.32.3
safetensors        0.4.4
sentencepiece      0.2.0
setuptools         72.1.0
sympy              1.13.2
tokenizers         0.19.1
torch              2.4.1
tqdm               4.66.5
transformers       4.44.2
translate          3.6.1
typing_extensions  4.12.2
urllib3            2.2.2
wheel              0.43.0

이중에 없는게 있다면 다운 받아주자!

 

7. 허깅 페이스 로그인, 인증

huggingface-cli login

허깅페이스 CLI를 사용하여 모델을 다운로드하거나 관리할 때, CLI 명령어를 통해 로그인하는 과정이 필요하다.

 

이 명령어를 사용하면, 토큰을 입력하는게 나오는데 여기서 우리가 발급받은 토큰을 입력하고, (invisible한게 정상)

 

Do you want to store these credentials for future use? [y/n]

메시지는 인증 토큰을 로컬에 저장하여, 후속 명령어를 사용할 때 매번 로그인 정보를 입력하지 않도록 해주는 옵션이다.

 

  • y (Yes): 인증 정보를 로컬에 저장하여, 나중에 명령어를 사용할 때 자동으로 인증되게 한다.
    이 경우, 다음에 huggingface-cli를 사용할 때, 인증 정보를 다시 입력할 필요가 없음.
  • n (No): 인증 정보를 저장하지 않고, 매번 인증을 입력해야한다.
    이 경우, 매번 huggingface-cli 명령어를 사용할 때 인증 토큰을 다시 입력해야함.

보안상의 이유로 n을 추천하지만, 상관없다. 취향껏 고르자.

 

여기까지 하고 나면

~ Login succesful 이라는 메세지를 볼 수 있다!

로그인이 성공적으로 이루어졌다는 것이다.

 

8. main.py 작성해주기 (Model 다운로드)

from transformers import AutoTokenizer
import transformers #transformers 모듈을 통해 자동으로 모델을 받을건데
import torch

# 모델로딩
model = "meta-llama/Llama-2-7b-chat-hf" #Llama-2-7b-chat-hf 모델을 받을 겁니다.
tokenizer = AutoTokenizer.from_pretrained(
    model,  #여기에 사용할 모델을 직접 넣어도 됩니다.
    use_auth_token="여기에는 발급받은 토큰값을 입력하세요!!!",    #토큰 입력부
)

# 파이프라인 설정
# (파이프라인이란 입력에서 출력까지의 흐름을 말합니다.)
pipeline = transformers.pipeline(
    "text-generation",  #반환을 어떻게 할것인지 정의
    model=model,    #어떤 모델로 할 것인지
    torch_dtype=torch.float16,  #텐서의 데이터형을 16비트 부동소수점으로 한다는말. 여튼 빠르다는 뜻
    device_map="auto",  #자동으로 CPU를 쓸건지 GPU를 쓸건지 정해줍니다.
)
💡 각 기능에 대한 설명

# 모델 로딩
from transformers import AutoTokenizer
import transformers
import torch

model = "meta-llama/Llama-2-7b-chat-hf"
tokenizer = AutoTokenizer.from_pretrained(
    model,
    use_auth_token="내 토큰값",
)

이 부분은 transformers 라이브러리를 사용해 모델과 토크나이저를 로딩하는 부분이다.
use_auth_token=토큰값을 통해 인증 토큰을 사용해서 모델을 다운로드한다.


# 파이프라인 설정

text-generation 파이프라인을 설정하는 부분이다.
모델의 텐서 데이터 타입을 16비트 부동소수점으로 설정하고,
device_map="auto"를 사용해서 CPU나 GPU를 자동으로 선택한다.

 

 

 

 

토큰 값 입력

HF_TOKEN = "내 토큰 값"

...

tokenizer = AutoTokenizer.from_pretrained(
    model,
    token=HF_TOKEN,
)

이런식으로 적어줘도 작동하지만,

 

보안상의 이유로, API 토큰을 직접 코드에 포함시키지 말고, 환경 변수로 설정하는 것을 추천한다.

다음과 같이 .env 파일이나 환경 변수로 설정할 수 있다.

import os
HF_TOKEN = os.getenv("HF_AUTH_TOKEN")
tokenizer = AutoTokenizer.from_pretrained(
    model,
    token=HF_TOKEN
)

 

 

그리고 방금 작성한 main.py를 실행해주자.

python main.py

 

$ python main.py
/opt/anaconda3/envs/my_llama2/lib/python3.12/site-packages/transformers/models/auto/tokenization_auto.py:786: FutureWarning: The `use_auth_token` argument is deprecated and will be removed in v5 of Transformers. Please use `token` instead.
  warnings.warn(
tokenizer_config.json: 100%|████████████████████████████████████████████████████████████| 1.62k/1.62k [00:00<00:00, 1.12MB/s]
tokenizer.model: 100%|████████████████████████████████████████████████████████████████████| 500k/500k [00:00<00:00, 8.64MB/s]
tokenizer.json: 100%|███████████████████████████████████████████████████████████████████| 1.84M/1.84M [00:00<00:00, 6.55MB/s]
special_tokens_map.json: 100%|██████████████████████████████████████████████████████████████| 414/414 [00:00<00:00, 2.73MB/s]
config.json: 100%|██████████████████████████████████████████████████████████████████████████| 614/614 [00:00<00:00, 4.42MB/s]
model.safetensors.index.json: 100%|█████████████████████████████████████████████████████| 26.8k/26.8k [00:00<00:00, 66.1MB/s]
model-00001-of-00002.safetensors: 100%|█████████████████████████████████████████████████| 9.98G/9.98G [18:07<00:00, 9.18MB/s]
model-00002-of-00002.safetensors: 100%|█████████████████████████████████████████████████| 3.50G/3.50G [06:10<00:00, 9.44MB/s]
Downloading shards: 100%|█████████████████████████████████████████████████████████████████████| 2/2 [24:19<00:00, 729.64s/it]
Loading checkpoint shards: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:03<00:00,  1.86s/it]
generation_config.json: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 188/188 [00:00<00:00, 1.38MB/s]
Some parameters are on the meta device because they were offloaded to the disk.

그러면 다음과 같이 뜨는데, 모델을 다운받는 과정이다.

 

용량이 큰 LLM을 내 컴퓨터에 직접 다운 받는 것이므로, 

시간이 꽤 오래 걸리는 것이 정상이다.

 

9. 언어 관련 기능 추가

드디어 모델이 다 다운받아졌다면, 다음 코드를 아까 작성했던 main.py 아래에 추가해주자.

from translate import Translator

# 텍스트 생성 함수
def generate(x, max_length=100):
    sequences = pipeline(
        x,
        do_sample=True,
        top_k=10,
        num_return_sequences=1,
        eos_token_id=tokenizer.eos_token_id,
        max_length=max_length,
    )

    return sequences[0]["generated_text"].replace(x, "")

# 번역기 설정
translator_ko_en = Translator(from_lang='ko', to_lang='en')
translator_en_ko = Translator(from_lang='en', to_lang='ko')

# 입력 텍스트 번역 및 출력
input_ko = "저녁메뉴는 뭐가 좋을까?"
input_en = translator_ko_en.translate(input_ko) 

output_en = generate(input_en,100)
output_ko =  translator_en_ko.translate(output_en)
print(output_en)
print(output_ko)

 

💡 각 기능별 설명

# 번역기 설정
from translate import Translator

translator_ko_en = Translator(from_lang='ko', to_lang='en')
translator_en_ko = Translator(from_lang='en', to_lang='ko')​
이 부분에서는 translate 모듈을 사용해 한국어에서 영어로, 그리고 영어에서 한국어로 번역할 번역기 객체를 생성한다.
translate 모듈이 없다면 pip install translate 로 다운로드 해주자.

# 텍스트 생성 함수

generate 함수는 주어진 텍스트를 기반으로 텍스트를 생성한다.
여기서는 샘플링을 사용해 텍스트를 생성하고, 생성된 텍스트에서 입력된 텍스트를 제거하였다.

# 입력 텍스트 번역 및 출력

이 부분은 한국어로 된 입력을 영어로 번역한 후,
텍스트 생성을 수행하고,
생성된 영어 텍스트를 다시 한국어로 번역해서 출력한다.

 

 

10. 최종 코드

따라서 최종 코드는 다음과 같이 될 것이다!

from translate import Translator
from transformers import AutoTokenizer, pipeline
import torch

HF_TOKEN = "토큰 값을 여기 입력하세요."

model = "meta-llama/Llama-2-7b-chat-hf"  # Llama-2-7b-chat-hf 모델을 사용

# 모델과 토크나이저를 받아옵니다.
tokenizer = AutoTokenizer.from_pretrained(
    model,
    token=HF_TOKEN,  
)

# 파이프라인 설정
device = torch.device("cpu")  # MPS에서 오류가 발생할 경우, CPU로 설정
text_generator = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.float16,
    device=device.index if torch.cuda.is_available() else -1  # GPU가 사용 가능하면 GPU, 아니면 CPU
)

def generate(x, max_length=100):
    sequences = text_generator(
        x,
        do_sample=True,
        top_k=10,
        num_return_sequences=1,
        eos_token_id=tokenizer.eos_token_id,
        max_length=max_length,
    )
    return sequences[0]["generated_text"].replace(x, "")

translator_ko_en = Translator(from_lang='ko', to_lang='en')
translator_en_ko = Translator(from_lang='en', to_lang='ko')

input_ko = "저녁 메뉴로 뭐가 좋을까?"
input_en = translator_ko_en.translate(input_ko)

output_en = generate(input_en, 100)
output_ko = translator_en_ko.translate(output_en)

print(output_en)
print(output_ko)

 

 

 

11. 실행 결과

python main.py

파일을 다시 실행하면 드디어 모델을 실행할 수 있다!


그런데 나는 main.py 파일을 실행한 후 거의 1시간 이후에 이 결과를 받아볼 수 있었다.

로컬 환경에서 진행할 경우 이렇게 하드웨어의 영향을 많이 받는 다는 단점이 있는 것이다.

따라서 GPU를 사용할 수 있는 환경이 아니라면 유료버전을 사용하거나 다른 API를 사용하는 것을 추천...😂