0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

HuggingFaceのオンラインモデル読込、スナップショットのダウンロード、ローカルモデル読込をしてみる(Llama3.2)

Last updated at Posted at 2025-03-09

記載日2025/03/09

備忘録です。
transformersを使って、HuggingFaceのモデル読込やスナップショットのダウンロード、ローカルにあるモデルの読込について、pythonでのやり方を記載します。LLMモデルはLlama3.2(3bと11b)を使います。
なお、Llama3.2:3bのモデルをロードやローカル保存する場合、容量を数G使います。Llama3.2:11bの場合は数十G使いますのでご注意ください。また、モデルを使う場合、Llama3.2:11bはGPU必須です(たぶん25Gくらい必要)。

環境

・OS : Ubuntu22.04(正確には、Windows11上のWSL2環境。GPUは60Gほど。)
・python : 3.11.11 (私の環境ではpyenvを使っています)

HuggingFace

AIモデルやデータセットを共有・利用するためのツールです。雑に言うと、AIモデル用Githubというイメージです。ホームページはこちら

手順

huggingface-hub (CLI) のインストール

AIモデルのダウンロードにhuggingface-hubを使います。huggingface-hub自体はpipでインストールできますが、モデルダウンロードにはHuggingFaceのアクセストークンを使う必要があります。
また、Llama3.2モデルの使用には、HuggingFaceのLlama3.2のウェブページにてMeta社へ利用申請をする必要があります。
このような理由から、huggingface-cliを使うために以下4ステップを踏みます。
詳細は参考の「HuggingFaceとは」「Llama3.2利用申請について」のサイトを確認ください。

  • HuggingFaceにアカウント作成
  • Meta社への利用申請
  • アクセストークン作成
  • huggingface-hubインストール

ライブラリのインストール

適宜必要なライブラリをpipでインストールしてください。参考までに、私の環境のrequirements.txtを以下に記載します。

requirements.txt
accelerate==1.4.0
bitsandbytes==0.45.2
certifi==2025.1.31
charset-normalizer==3.4.1
huggingface-hub==0.28.1
filelock==3.17.0
fsspec==2025.2.0
idna==3.10
Jinja2==3.1.5
MarkupSafe==3.0.2
mpmath==1.3.0
networkx==3.4.2
numpy==2.2.2
nvidia-cublas-cu12==12.4.5.8
nvidia-cuda-cupti-cu12==12.4.127
nvidia-cuda-nvrtc-cu12==12.4.127
nvidia-cuda-runtime-cu12==12.4.127
nvidia-cudnn-cu12==9.1.0.70
nvidia-cufft-cu12==11.2.1.3
nvidia-curand-cu12==10.3.5.147
nvidia-cusolver-cu12==11.6.1.9
nvidia-cusparse-cu12==12.3.1.170
nvidia-cusparselt-cu12==0.6.2
nvidia-nccl-cu12==2.21.5
nvidia-nvjitlink-cu12==12.4.127
nvidia-nvtx-cu12==12.4.127
packaging==24.2
pillow==11.1.0
PyYAML==6.0.2
regex==2024.11.6
requests==2.32.3
safetensors==0.5.2
sympy==1.13.1
tokenizers==0.21.0
torch==2.6.0
tqdm==4.67.1
transformers==4.48.3
triton==3.2.0
typing_extensions==4.12.2
urllib3==2.3.0

コード

※次のコードは、事前にhuggingface-hubでloginする必要があるかと思います(もしかすると環境変数 : HF_TOKENにアクセストークンを設定しないとうまく動かない方もいるかもしれません。)。login関数を使ってコード完結することもできると思います。

pythonで、オンラインモデル読込、スナップショットのダウンロード、ローカルモデル読込を行うコードサンプルは下記です。3b用、11b用で分けていますが、中身はほぼ同じです。違いは以下。

  • Llama3.2:3bはテキストのみのモデルなので、モデル作成クラスはAutoModelForCausalLMを使用
  • Llama3.2:11bはビジョンモデルなので、モデル作成クラスはMllamaForConditionalGenerationを使用
# Llama.py
import os
import requests
import torch
from PIL import Image
from transformers import AutoModelForCausalLM, AutoProcessor, AutoTokenizer, BitsAndBytesConfig, MllamaForCausalLM, MllamaForConditionalGeneration, pipeline
from huggingface_hub import snapshot_download

class Llama():
    model_id_3b = "meta-llama/Llama-3.2-3B-Instruct"
    model_id_vision_11b = "meta-llama/Llama-3.2-11B-Vision-Instruct"

    # 4bit量子化
    bnb_config = BitsAndBytesConfig(
        load_in_4bit=True,
        bnb_4bit_quant_type="nf4",
        bnb_4bit_compute_dtype=torch.bfloat16
    )

    def __init__(self):
        self.download_snapshot(self.model_id_vision_11b, "./llm/snapshot/11b/")
        self.load_local_model_11b("./llm/snapshot/11b/")
        
        self.download_snapshot(self.model_id_3b, "./llm/snapshot/3b/")
        self.load_local_model_3b("./llm/snapshot/3b/")
        
        self.load_online_model_11b(self.model_id_vision_11b)
        
        self.load_online_model_3b(self.model_id_3b)
    
    def download_snapshot(self, model_id, model_dir: str):
        # プロジェクトディレクトリを基準として、"./llm/snapshot/"にモデルファイルが保存される。
        snapshot_download(model_id, local_dir=model_dir)

    def load_local_model_11b(self, model_dir: str):
        self.model = MllamaForConditionalGeneration.from_pretrained(
            model_dir,
            torch_dtype=torch.bfloat16,
            quantization_config=self.bnb_config,
            device_map="auto"
        )
    
    def load_online_model_11b(self, model_id):
        # モデル作成クラスはVisionで使えるMllamaForConditionalGenerationを使う
        self.model = MllamaForConditionalGeneration.from_pretrained(
            model_id,
            torch_dtype=torch.bfloat16,
            quantization_config=self.bnb_config,
            device_map="auto"
        )
        self.processor = AutoProcessor.from_pretrained(model_id)
        self.tokenizer = AutoTokenizer.from_pretrained(model_id)
        
        # モデルのローカル保存
        self.model.save_pretrained("./llm/online/11b/")
        self.processor.save_pretrained("./llm/online/11b/")
        self.tokenizer.save_pretrained("./llm/online/11b/")

    def load_local_model_3b(self, model_dir: str):
        self.model = AutoModelForCausalLM.from_pretrained(
            model_dir,
            torch_dtype=torch.bfloat16,
            quantization_config=self.bnb_config,
            device_map="auto"
        )
    
    def load_online_model_3b(self, model_id):
        # モデル作成クラスはAutoModelForCausalLMを使う
        self.model = AutoModelForCausalLM.from_pretrained(
            model_id,
            torch_dtype=torch.bfloat16,
            quantization_config=self.bnb_config,
            device_map="auto"
        )
        self.processor = AutoProcessor.from_pretrained(model_id)
        self.tokenizer = AutoTokenizer.from_pretrained(model_id)

        # モデルのローカル保存
        self.model.save_pretrained("./llm/online/3b/")
        self.processor.save_pretrained("./llm/online/3b/")
        self.tokenizer.save_pretrained("./llm/online/3b/")

参考にさせて頂いたサイト

・HuggingFaceとは
https://udemy.benesse.co.jp/data-science/huggingface.html
・Llama3.2利用申請について
https://highreso.jp/edgehub/machinelearning/llama32.html

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?