Transformers 라이브러리를 활용해 safetensors 형식으로 저장된 LLaMA 모델을 로딩하려고 했습니다. 아래는 제가 사용한 코드입니다.
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig, pipeline
from langchain_community.llms import HuggingFacePipeline
import torch, os
os.environ["HF_HOME"] = "D:/huggingface_cache"
model_id = "beomi/llama-2-ko-7b"
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4"
)
tokenizer = AutoTokenizer.from_pretrained(model_id, use_fast=True)
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="auto",
trust_remote_code=True,
quantization_config=bnb_config,
local_files_only=True
)
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)
llm = HuggingFacePipeline(pipeline=pipe)
첫 번째 에러
TypeError: expected str, bytes or os.PathLike object, not NoneType
해당 에러는 다음 코드에서 발생했다:
tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False)
use_fast=False를 명시하면 transformers는 내부적으로 tokenizer.model 경로를 수동으로 찾는다. 그런데 LlamaTokenizer가 반환한 tokenizer.model이 None인 상태였고, 결국 open(None)이 호출되어 TypeError가 터졌다.
해결 방법
tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=True)
use_fast=True로 변경해주면 Hugging Face에서 제공하는 fast tokenizer를 정상적으로 로딩하게 되고, 경로 문제도 발생하지 않는다.
두 번째 에러 : OSError – 일부 safetensors shard 누락
첫 번째 문제를 해결하고 나서 다시 모델을 로딩하자, 이번에는 다음과 같은 OSError가 발생했다:
OSError: beomi/llama-2-ko-7b does not appear to have files named
('model-00001-of-00015.safetensors', 'model-00002-of-00015.safetensors', ..., 'model-00015-of-00015.safetensors')
beomi/llama-2-ko-7b 모델은 총 15개의 .safetensors shard로 구성되어 있다. 그런데 Hugging Face에서 모델을 다운받는 과정
에서 캐시 폴더를 확인해보니 일부만 다운로드된 상태였다. 처음에는 단 두 개의 shard만 존재했고, 다시 실행해보니 세 개까지 받아졌지만 여전히 불완전한 상태였다.(왜인지 아직도 모르겠다.. 네트워크 문제일지도...)
해결 방법
https://huggingface.co/beomi/llama-2-ko-7b/tree/main 에서 직접 .safetensors 파일들을 모두 수동으로 다운로드한 뒤, 내 로컬의 캐시 디렉터리(D:/huggingface_cache/...)로 이동시켜주었다. -> 성공!