Hugging face 가중치 없는 모델 로드하기

J. Hwang·2025년 1월 22일
0

Thanks to ASOTEA!

meta-llama/Llama-3.2-3B-Instruct-QLORA_INT4_EO8meta-llama/Llama-3.2-3B-Instruct-SpinQuant_INT4_EO8를 로드해보려하다

from transformers import AutoTokenizer

model_name = "meta-llama/Llama-3.2-3B-Instruct-QLORA_INT4_EO8"
tokenizer = AutoTokenizer.from_pretrained(model_name, use_fast=False, token=token)    # llama-3B에 access 가능한 계정의 토큰 필요!

이 과정에서 tokenizer가 False로 반환되는 것을 확인했다.

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained(
                    "meta-llama/Llama-3.2-3B-Instruct-QLORA_INT4_EO8",
                    torch_dtype=torch.float16,
                    token=token)

이런 식으로 모델을 불러와도 아래와 같은 에러가 뜨면서 모델이 로드되지 않는다.
OSError: meta-llama/Llama-3.2-3B-Instruct-QLORA_INT4_EO8 does not appear to have a file named pytorch_model.bin, model.safetensors, tf_model.h5, model.ckpt or flax_model.msgpack.

hugging face의 Files and Versions 탭을 보니 정말로 pytorch_model.bin, model.safetensors, tf_model.h5, model.ckpt, flax_model.msgpack 중 어느 것도 보이지 않는다.

정상적으로 불러와지는 일반 llama-3B hugging face의 Files and Versions 탭을 보면 model-00001-of-00002.safetensors와 같은 모델 가중치 파일이 정상적으로 업로드되어 있는데, SpinQuant나 QLoRA의 경우 업로드 되어 있지 않은 것을 볼 수 있다.

이럴 때 transformer 라이브러리의 코드를 이용하면 가중치 파일을 만들어 낼 수 있다고 한다.

우선 필요한 패키지를 설치해준다.

pip install tiktoken
pip install blobfile

그런 다음 hugging face Files and Versions 탭에서 관련 파일들을 모두 다운로드하고 transformers 라이브러리를 git clone 해온다.
git clone https://github.com/huggingface/transformers.git
cd transformers로 이동한 다음 아래와 같이convert_llama_weights_to_hf.py 코드를 실행하면 원래는 없었던 QLoRA의 가중치 파일이 만들어진다.

⚠️ 실행하기 전에 write_model 함수에서 safe_serialization=True로 수정한다.
python src/transformers/models/llama/convert_llama_weights_to_hf.py --input_dir "/models/Llama-3.2-1B-Instruct-QLORA_INT4_EO8" --model_size 3B --output_dir "/models/Llama-3.2-1B-Instruct-QLORA_INT4_EO8-hf" --llama_version 3.2

그러면 이제 모델을 업로드할 수 있게 된다.

from transformers import AutoTokenizer, AutoModelForCausalLM

# 모델 및 만들어진 가중치 파일이 있는 디렉토리
model_path = "./Llama-3.2-3B-Instruct-QLORA_INT4_EO8-hf"

# tokenizer 로드
tokenizer = AutoTokenizer.from_pretrained(model_path)

# 모델 로드
model = AutoModelForCausalLM.from_pretrained(
    model_path,
    device_map="auto",
    torch_dtype=torch.float16,
    low_cpu_mem_usage=True
    )

그러나 업로드한 모델을 테스트해보면 결과가 다소 이상하다.

# 입력 텍스트 인코딩, bos_token과 eos_token 추가
input_text = "Hello world!"
inputs = tokenizer(input_text, return_tensors="pt", add_special_tokens=True)

# 모델을 평가 모드로 설정
model.eval()

# GPU 사용 설정 (사용 가능한 경우)
if torch.cuda.is_available():
    model = model.cuda()
    inputs = {k: v.cuda() for k, v in inputs.items()}

# 출력 생성
outputs = model.generate(**inputs)
output_text = tokenizer.decode(outputs[0], skip_special_tokens=True)

print(output_text)   # Hello World Proceedんだ Laglates arrayessions posterior majorversions pyramidENTER Scar

이는 transformers가 QLoRA 아키텍쳐를 지원하지 않아서 생기는 문제로 추정하고 있다.

Spinquant는 이 방법대로 실행했을 때 문제없이 실행되는지 추후 확인해 볼 예정.


References

https://huggingface.co/docs/transformers/main/model_doc/llama3
https://www.reddit.com/r/LocalLLaMA/comments/1gbqugf/how_do_i_run_llama323binstructint4qloraeo8_in_my/?rdt=33558
https://github.com/huggingface/transformers/blob/main/src/transformers/models/llama/convert_llama_weights_to_hf.py

profile
Let it code

0개의 댓글