基础模型: Qwen/Qwen2.5-Coder-1.5B-Instruct
基础模型关系: 微调
库名称: peft
语言:
- 英语
标签:
- 代码
- codeqwen
- 聊天
- qwen
- qwen-coder
许可证: gpl-3.0
数据集:
- nvidia/OpenCodeReasoning
流水线标签: 文本生成
许可证链接: 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": "你是一个有用的编程助手。"},
{"role": "user", "content": "请提供一个检查数字是否为质数的Python脚本。"}
]
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>
特殊标记。如你所见,推理模型
现在可以“思考”了。
基础模型
系统:
你是一个有用的编程助手。
用户:
请提供一个检查数字是否为质数的Python脚本。
助手:
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是否是质数。
推理模型
系统:
你是一个有用的编程助手。
用户:
请提供一个检查数字是否为质数的Python脚本。
助手:
<think>
好的,我需要编写一个Python程序来检查给定的数字是否是质数。嗯,什么是质数?哦对了,质数只有两个不同的正除数:1和它本身。所以一个数字要成为质数,除了这两个数外不能有其他除数。
首先,让我们思考涉及的步骤。第一件事是确定是否有除1和数字本身以外的除数。我怎么检查呢?
对于数字n,从2到sqrt(n),检查是否有任何数能整除n。如果有,那么它不是质数。但是等等,也许在检查到平方根之前,某些数字可能有超过平方根的因子。例如,取9。平方根是3。所以检查2,3,4会捕捉到9的因子。等等,但3能整除9,所以从2到sqrt(n)(这里是3)的循环会检查2和3。所以是的,检查到平方根就足够了,因为任何合数至少有一个因子小于或等于其平方根。
所以计划是:
- 从输入中读取一个整数。
- 检查数字是否小于2。如果是,它不是质数。
- 否则,从2检查到数字的平方根。对于每个i,如果数字模i为零,返回False。
- 如果在此范围内没有数字能整除该数字,返回True。
等等,但0和1呢?根据问题描述,输入可能是0或1,它们不是质数。所以我们应该单独处理这些情况。
让我概述代码结构。
将输入数字读取为整数。我们称之为num。
首先处理边缘情况:
- 如果num < 2:打印“否”(因为质数>=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("否")
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("是" if is_prime else "否")
等等,但等等,像25这样的数字呢?平方根是5。所以循环从2运行到5。当i=5时,25%5是0,所以返回false。正确。
这个逻辑看起来可靠。让我测试一些例子。
测试用例1:输入7。循环运行到2。2到2。检查2。7%2是1,所以返回true。输出是。
测试用例2:输入6。sqrt(6)是~2.449。所以sqrt_n是2。循环从2到2。检查2。6%2是0。所以返回false。输出否。
另一个测试用例:8。sqrt(8)是~2.828。所以sqrt_n是2。检查2。8%2是0。所以输出否。
质数如13呢?sqrt(13)是~3.605。所以循环到3。检查2和3。13%2是1,13%3是1。所以返回true。正确。
边缘情况:1。输出否。
另一个边缘情况:2。输出是。
非常大的数字,比如999983(质数)。代码应检查到sqrt(999983)约999.9。所以循环运行2到999。它将检查所有可能的因子。由于它是质数,没有能整除它的数。所以返回是。
所以代码似乎能正确处理所有情况。
我想这就是解决方案。现在,根据这个编写代码。
</think>
import math
n = int(input())
if n < 2:
print("否")
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("是" if is_prime else "否")
数据集
训练
基础
参数 |
值 |
基础模型 |
Qwen/Qwen2.5-Coder-1.5B-Instruct |
微调方法 |
QLoRA |
任务类型 |
CAUSAL_LM |
训练轮数 |
3 |
批量大小 |
1 |
梯度累积步数 |
1 |
有效批量大小 |
1 |
学习率 |
2e-4 |
学习率调度器类型 |
cosine |
预热比例 |
0.05 |
精度 |
FP16 混合精度 |
梯度检查点 |
True |
仅完成损失 |
True |
打包 |
False |
最大序列长度 |
8192 tokens |
日志记录步数 |
每10000 步 |
保存检查点步数 |
每10000 步 |
输出目录 |
.model |
PEFT/LoRA
参数 |
值 |
LoRA 秩 (r ) |
16 |
LoRA Alpha |
32 |
LoRA Dropout |
0.05 |
LoRA Bias |
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 |
许可证
链接
团队