はじめに
Microsoftの「Phi-4」をHuggingFaceが開発している「Open R1」で学習させて論理思考モデルにしたものが「phi-4-open-R1-Distill-EZOv1」です。huggingface.co
「Open R1」はDeepSeek-R1で用いられている方法を再現しようとしたもののようです。
関連記事
「DeepSeek-R1-Distill-Qwen-14B」の記事はこちらtouch-sp.hatenablog.com
「DeepSeek-R1-Distill-Qwen-14B-Japanese」の記事はこちら
touch-sp.hatenablog.com
Pythonスクリプト
TorchAOを使って8bit量子化を行いました。from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer, TorchAoConfig import torch # model was downloaded from https://huggingface.co/AXCXEPT/phi-4-open-R1-Distill-EZOv1 model_name = "phi-4-open-R1-Distill-EZOv1" quantization_config = TorchAoConfig("int8_weight_only", group_size=128) model = AutoModelForCausalLM.from_pretrained( model_name, quantization_config=quantization_config, torch_dtype=torch.bfloat16, device_map="auto" ) tokenizer = AutoTokenizer.from_pretrained(model_name) streamer = TextStreamer( tokenizer, skip_prompt=True, skip_special_tokens=True ) prompt = '''ある父と子の年齢に関する問題があります。条件は次の通りです: 父の現在の年齢は息子の現在の年齢の3倍です。 6年前、父の年齢は息子の年齢の5倍でした。 父と息子の年齢を求めてください。''' messages = [ {"role": "system", "content": "You are an excellent AI."}, {"role": "user", "content": prompt} ] input_tensors = tokenizer.apply_chat_template( messages, add_generation_prompt=True, return_tensors="pt", return_dict=True ).to(model.device) input_ids = input_tensors["input_ids"] attention_mask = input_tensors["attention_mask"] output_ids = model.generate( inputs=input_ids, attention_mask=attention_mask, max_new_tokens=4096, pad_token_id=tokenizer.eos_token_id, streamer=streamer )
結果
「thinking」と「answer」の二つが出力されます。<thinking> まず、問題の条件を整理します。現在の父の年齢をF、息子の年齢をSとします。 1. 現在の年齢関係:F = 3S 2. 6年前の年齢関係:F - 6 = 5(S - 6) これらの2つの方程式を解く必要があります。まず1つ目の方程式からFをSで表します: F = 3S 次に2つ目の方程式に代入します: 3S - 6 = 5(S - 6) 3S - 6 = 5S - 30 30 - 6 = 5S - 3S 24 = 2S S = 12 Sが12であることが分かったので、Fを計算します: F = 3S = 3×12 = 36 最後に、6年前の年齢関係を確認します: 父:36 - 6 = 30 息子:12 - 6 = 6 30 = 5×6 となり、条件を満たしています。 したがって、父の年齢は36歳、息子の年齢は12歳となります。 </thinking>
<answer> 父の年齢は36歳、息子の年齢は12歳です。 【計算の根拠】 1. 現在の年齢関係:F = 3S 2. 6年前の年齢関係:F - 6 = 5(S - 6) 3. 代入計算: 3S - 6 = 5S - 30 24 = 2S → S = 12 4. 父の年齢:3×12 = 36 5. 6年前の確認:30 = 5×6(条件成立) </answer>
連立方程式を立てて、それを解くことができました。