ローカルLLM｜量子化LLM｜Phi3

# Phi3について

---

**Phi3**は、Microsoftが提供する大規模言語モデル（LLM）で、特に制約のあるリソース環境に適した4bit量子化モデルが公開されています。このモデルは、HuggingFaceで無料公開されており、Windowsローカル環境でも利用可能です。特に、GPUがない環境でも動作するため、ハードウェアリソースが限られているユーザーにとって魅力的な選択肢です。

---

# Phi3をWindowsローカル環境に構築する手順

ここでは、GPUがないWindows環境で「Phi3」を使用するための手順を解説します。

## ０．前提条件
- **OS**: Windows 11
- **メモリ**: 32GB
- **CPU**: Intel Core i7
- **GPU**: なし
- **開発環境**: Python

## １．LLMのダウンロード

GPUがない計算リソースの限られた環境を前提として、**4bit量子化**された「Phi-3-mini-4k-instruct-q4」を利用します。  
以下の手順でダウンロードしてください。

1. HuggingFaceの[モデルページ](https://huggingface.co/microsoft/Phi-3-mini-4k-instruct-gguf/tree/main)にアクセスし、「Phi-3-mini-4k-instruct-q4.gguf」をダウンロードします。
   - **ファイルサイズ**: 2.39GB
   
2. ダウンロード後、モデルファイルを任意のパスに保存します。ここでは、`C:\LLMs\Phi-3-mini-4k-instruct-q4.gguf`に保存したと仮定して進めます。

## ２．LLMの利用方法

ダウンロードしたモデルをPythonスクリプトを使って利用します。以下のコードを任意のファイルに保存し、実行してください。

```python
from llama_cpp import Llama

llm = Llama(
  model_path="C:/LLMs/Phi-3-mini-4k-instruct-q4.gguf",  # ダウンロードしたモデルのパス
  n_ctx=4096,  # 最大シーケンス長を設定
  n_threads=8, # CPUのスレッド数をシステムに合わせて設定
  n_gpu_layers=0, # GPUのない環境では0に設定
)

prompt = "カワウソについて、説明してください。"

# 推論の実行
output = llm(
  f"
\n{prompt}
\n
",
  max_tokens=4000,
  stop=["
"], 
  echo=True,
)

print(output['choices'][0]['text'])
```

## ３．実行結果

このスクリプトを実行すると、以下のような出力が得られます。実行時間はおおよそ1分30秒でした。

### 日本語での結果

```

カワウソについて、説明してください。


 カワウソ（コジロウソ）は、大陸の海洋地域に生息する哺乳類の一つの植物であり、主に冷たい、深い海域を味わうことで知られています。これは主に日本を中心にアメリカ合衆国に属する人間によって獲得され、特に北海道や東北地方では伝統的に食品としての地位を占めています。

カワウソは、その棚から生産された魚の骨を作られた魚介類で、肉材として有名です。柔質で食用に適した品質を持つため、多くの料理で使用されます。クリーンマターやスパイスの組み合わせを通して、異なる味わいを楽しむことができます。

～～～省略～～～
```

日本語の生成結果はあまり質が高くないため、日本語での利用には不向きであることがわかりました。

### 英語での結果
同じく英語で「Please tell me about otter.」と質問した結果は非常に良好で、こちらは明確で豊富な情報を含む回答が得られました。

```


Please tell us about otters.


 Otters are fascinating and diverse creatures that belong to the family Mustelidae, which includes weasels, badgers, and wolverines. There are 13 extant species of otters, with about 15 subspecies. They are semiaquatic mammals, known for their playful and social behavior. Here are some key facts about otters:

**Taxonomy and Species**
- Otters are divided into two subfamilies: Lutrinae (true otters) and Mustelinae (weasels, minks, and their relatives).
- Some of the most well-known otter species include the North American river otter (Lontra canadensis), the Eurasian and North American sea otter (Enhydra lutris), and the Giant otter (Pteronura brasiliensis).

**Physical Characteristics**
- Otters have streamlined bodies, short limbs, and a flattened tail. Their limbs are adapted for swimming, with webbed feet, and they possess a dense and waterproof coat made of two layers of fur.
- Their fur is long and oily, which provides insulation and repels water.
- Otters have a keen sense of smell and excellent hearing, which are crucial for their survival in aquatic environments.

～～～以下、省略～～～
```

日本語に翻訳：
```
<|ユーザー|>
カワウソについて教えてください 


 カワウソは、イタチ、アナグマ、クズリなどを含むイタチ科に属する、魅力的で多様な生き物です。現存するカワウソは13種、亜種は15種ほどいる。カワウソは半水棲哺乳類で、遊び好きで社会的な行動で知られている。以下にカワウソに関する重要な事実をいくつか挙げる：

**分類学と種**
- カワウソは2つの亜科に分けられる： Lutrinae（真のカワウソ）とMustelinae（イタチ、ミンク、およびそれらの近縁種）。
- 最もよく知られているカワウソの仲間には、北アメリカのカワウソ（Lontra canadensis）、ユーラシアおよび北アメリカのラッコ（Enhydra lutris）、コツメカワウソ（Pteronura brasiliensis）などがいる。

**身体的特徴**
- カワウソの体は流線型で、手足は短く、尾は扁平である。手足は泳ぐのに適しており、足には網があり、2層の毛皮でできた密生した防水性の被毛を持っている。
- 毛皮は長く油分が多いため、保温性があり、水をはじく。
- カワウソは鋭い嗅覚と優れた聴覚を持っており、これは水中環境での生存に不可欠である。

～～～以下、省略～～～
```

英語で質問すると、かなりいい感じの回答を生成してくれることがわかりました。
国際学会や国際ジャーナルに投稿するときは英語で実験する必要があるので、実験で性能の異なるLLMを比較するときに、使えそうです。
一方で、普段使いをするときは、英語に翻訳する手間が惜しいので、日本語に強い他のローカルLLMを使用したいという印象です。

---

# まとめ

**Phi3**は、英語を主に利用するプロジェクトにおいて優れた性能を発揮する一方、日本語での精度は低いため、日本語利用を前提としたプロジェクトでは他のLLMを検討する必要があります。しかし、リソースの限られた環境でLLMを試したい場合には、軽量なモデルとして非常に有用です。