base_model: Qwen/Qwen2.5-Coder-1.5B-Instruct
base_model_relation: finetune
library_name: peft
language:
- en
tags:
- code
- codeqwen
- chat
- qwen
- qwen-coder
license: gpl-3.0
datasets:
- nvidia/OpenCodeReasoning
pipeline_tag: text-generation
license_link: https://huggingface.co/bunyaminergen/Qwen2.5-Coder-1.5B-Instruct-Reasoning/blob/main/LICENSE
Qwen2.5-Coder-1.5B-Instruct-Reasoning
Qwen2.5-Coder-1.5B-Instruct-Reasoning
モデルは、推論能力を強化するためにnvidia/OpenCodeReasoning
データセットで教師ありファインチューニング(SFT)されています。
目次
使用方法
Hugging Face
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer
base_model_name = "Qwen/Qwen2.5-Coder-1.5B-Instruct"
adapter_repo = "bunyaminergen/Qwen2.5-Coder-1.5B-Instruct-Reasoning"
tokenizer = AutoTokenizer.from_pretrained(adapter_repo, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
base_model_name,
device_map="auto",
torch_dtype="auto",
)
model.resize_token_embeddings(len(tokenizer))
model = PeftModel.from_pretrained(model, adapter_repo)
model.eval()
messages = [
{"role": "system", "content": "You are a helpful coding assistant."},
{"role": "user", "content": "Please provide a Python script that checks whether a number is prime."}
]
prompt = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(
**inputs,
max_new_tokens=2048
)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
比較
- 推論モデルの
<think> </think>
特殊トークンに注目してください。この推論モデル
は「考える」ことができるようになりました。
ベースモデル
System:
あなたは役立つコーディングアシスタントです。
User:
数値が素数かどうかをチェックするPythonスクリプトを提供してください。
Assistant:
def check_prime(num):
if num < 2:
return False
for i in range(2, int(num**0.5) + 1):
if num % i == 0:
return False
return True
number = 7
if check_prime(number):
print(f"{number}は素数です。")
else:
print(f"{number}は素数ではありません。")
このPythonスクリプトでは、check_prime
関数が整数を入力として受け取り、素数ならTrue
、そうでなければFalse
を返します。関数はまず数値が2未満かチェックし、素数でないと判断します。次に、2から数値の平方根まで(含む)の範囲で反復処理を行い、この範囲内で数値の因数が見つかれば即座にFalse
を返し、素数でないことを示します。すべての可能な除数をチェックしても因数が見つからなければ、関数は数値が素数であると結論付けTrue
を返します。
使用例では、数値7でcheck_prime
関数を呼び出しています。出力は7が素数かどうかを示します。
推論モデル
System:
あなたは役立つコーディングアシスタントです。
User:
数値が素数かどうかをチェックするPythonスクリプトを提供してください。
Assistant:
<think>
わかりました、与えられた数値が素数かどうかをチェックするPythonプログラムを書く必要があります。えーと、素数とは何でしたっけ?ああ、そうだ、素数はちょうど2つの異なる正の約数(1とそれ自身)を持つ数です。つまり、素数であるためには、それ以外の約数を持ってはいけません。
まず、必要なステップを考えましょう。最初に、1と数値自身以外の約数があるかどうかを判断する必要があります。どうやってチェックすればいいでしょうか?
数値nに対して、2からsqrt(n)までの範囲で、nを割り切る数があるかチェックします。もしあれば、素数ではありません。でも待って、平方根を超える範囲にも因数があるかもしれません。例えば、9の場合、平方根は3です。2,3,4をチェックすると9の因数が見つかります。3は9を割り切るので、2からsqrt(n)(この場合は3)までのループで2と3をチェックします。つまり、平方根までチェックすれば十分です。なぜなら、合成数は少なくとも1つの因数が平方根以下だからです。
計画は次の通りです:
- 入力から整数を読み取る。
- 数値が2未満かチェック。そうであれば素数ではない。
- それ以外の場合、2から数値の平方根までチェック。各iについて、数値 mod iが0ならFalseを返す。
- この範囲内で数値を割り切る数がなければTrueを返す。
0と1はどうでしょうか?問題文によれば、入力は0や1もあり得ますが、これらは素数ではありません。これらのケースを別途処理する必要があります。
コードの構造を概説しましょう。
入力数値を整数として読み取ります。numと呼びましょう。
まずエッジケースを処理:
- num < 2の場合: "No"を出力(素数は2以上)
それ以外:
sqrt_num = int(math.sqrt(num))を計算
2からsqrt_numまで(含む)ループ。各iについて、num % i ==0をチェック。該当するiがあればFalseを返す。すべてチェック後、Trueを返す。
Pythonで平方根を正確に計算するには?整数にはmath.isqrtを使うと、平方根の床が返されます。**演算子よりも浮動小数点の不正確さを避けられます。
完全平方数の場合、例えば9。math.isqrt(9)は3。ループは3までチェック。i=3の時、9%3は0なのでFalseを返し、正しい。
コードは次のようになります:
import math
n = int(input())
if n < 2:
print("No")
else:
sqrt_n = math.isqrt(n)
is_prime = True
for i in range(2, sqrt_n +1):
if n % i == 0:
is_prime = False
break
print("Yes" if is_prime else "No")
25のような数値は?平方根は5。ループは2から5。i=5の時、25%5は0でFalseを返す。正しい。
このロジックは堅牢です。いくつかテストケースで試しましょう。
テストケース1: 入力7。ループは2まで。2をチェック。7%2は1でTrueを返す。出力Yes。
テストケース2: 入力6。sqrt(6)は約2.449。sqrt_nは2。ループは2から2。2をチェック。6%2は0でFalseを返す。出力No。
別のテストケース: 8。sqrt(8)は約2.828。sqrt_nは2。2をチェック。8%2は0で出力No。
素数13の場合。sqrt(13)は約3.605。ループは3まで。2と3をチェック。13%2は1、13%3は1でTrueを返す。正しい。
エッジケース: 1。出力No。
別のエッジケース: 2。出力Yes。
非常に大きな数値、例えば999983(素数)。コードはsqrt(999983)までチェック。約999.9。ループは2から999。すべての可能な因数をチェック。素数なので割り切れずYesを返す。
このコードはすべてのケースを正しく処理します。
これが解決策だと思います。コードを記述します。
</think>
import math
n = int(input())
if n < 2:
print("No")
else:
sqrt_n = math.isqrt(n)
is_prime = True
for i in range(2, sqrt_n + 1):
if n % i == 0:
is_prime = False
break
print("Yes" if is_prime else "No")
データセット
トレーニング
ベース
パラメータ |
値 |
ベースモデル |
Qwen/Qwen2.5-Coder-1.5B-Instruct |
ファインチューニング方法 |
QLoRA |
タスクタイプ |
CAUSAL_LM |
エポック数 |
3 |
バッチサイズ |
1 |
勾配蓄積ステップ |
1 |
実効バッチサイズ |
1 |
学習率 |
2e-4 |
LRスケジューラタイプ |
cosine |
ウォームアップ比率 |
0.05 |
精度 |
FP16 Mixed Precision |
勾配チェックポイント |
True |
完了のみ損失 |
True |
パッキング |
False |
最大シーケンス長 |
8192 tokens |
ロギングステップ |
毎10000 ステップ |
チェックポイント保存ステップ |
毎10000 ステップ |
出力ディレクトリ |
.model |
PEFT/LoRA
パラメータ |
値 |
LoRAランク (r ) |
16 |
LoRAアルファ |
32 |
LoRAドロップアウト |
0.05 |
LoRAバイアス |
none |
タスクタイプ |
CAUSAL_LM |
ターゲットモジュール |
q_proj , k_proj , v_proj , o_proj , gate_proj , up_proj , down_proj |
保存モジュール |
embed_tokens , lm_head |
モデル
パラメータ |
値 |
名前 |
Qwen/Qwen2.5-Coder-1.5B-Instruct |
アテンション実装 |
flash_attention_2 |
load_in_4bit |
true |
bnb_4bit_quant_type |
nf4 |
bnb_4bit_use_double_quant |
true |
データセット
パラメータ |
値 |
データセット名 |
nvidia/OpenCodeReasoning |
分割 |
split_0 |
行数 |
8000 |
最大トークン長 |
8192 |
シャッフル |
True |
プロセス数 |
4 |
トークナイザ
パラメータ |
値 |
切り捨て |
有効 (max_length=8192 ) |
マスク言語モデリング (MLM) |
False |
速度、サイズ、時間
パラメータ |
値 |
総トレーニング時間 |
約3.5時間 |
チェックポイント頻度 |
毎10000 ステップ |
チェックポイントステップ |
checkpoint-10000 , checkpoint-20000 , checkpoint-24000 |
コンピュートインフラ
パラメータ |
値 |
GPU |
1 × NVIDIA H100 SXM (80 GB VRAM) |
RAM |
125 GB |
CPU |
16 vCPU |
OS |
Ubuntu 22.04 |
フレームワーク |
PyTorch 2.4.0 |
CUDAバージョン |
12.4.1 |
ライセンス
リンク
チーム
連絡先
参考文献
引用
@software{ Qwen2.5-Coder-1.5B-Instruct-Reasoning,
author = {Bunyamin Ergen},
title = {{Qwen2.5-Coder-1.5B-Instruct-Reasoning}},
year = {2025},
month = {04},
}