介绍一个可以白嫖GPU资源的网站

   如果需要微调一个大模型,GPU资源是必不可少的,但是对于个人玩家来说,肯定是能不花钱就不花钱的。这里
介绍一个可以白嫖GPU资源的网站,Kaggle。Kaggle是一个在线机器学习平台,提供了免费的GPU资源,每周可以
白嫖30个小时的GPU资源。
   下边,我们就以一个简单的例子,来介绍一下如何在Kaggle上白嫖GPU资源。

部署DeepSeek-R1

1、在Kaggle上创建一个项目

在Kaggle上创建一个新的项目

项目代码编辑器是Jupyter Notebook.
初始的项目代码如下:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

# Input data files are available in the read-only "../input/" directory
# For example, running this (by clicking run or pressing Shift+Enter) will list all files 
#under the input directory

import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))

# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved 
#as output when you create
#a version using "Save & Run All" 
# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of 
#the current session

2、设置项目的环境

 在菜单栏的Settings选项卡中,有三个选项:
 a、Trun off internet : 代码执行过程中,需要不需要网络。
 b、Accelerator: 选择需要的GPU资源。我们选择T4 * 2
 c、Environment Preferences: 代码的运行环境,我们选择 Pin to original environment(2025-05-13),
 这个会不断变化,大家根据自己情况选择。
 在菜单栏的Add-ons选项卡中,有Secrets选项:是用来设置环境变量的。我设置了调用huggingface和wandb的2个密钥,
 因为后边微调会用到。

 如果要查看自己本周gpu资源还剩多少,点击右上角自己头像。

GPU资源查看 其它更多的设置,大家自己摸索。

3.部署deepseek-R1

1
2
3
4
### 安装微调工具unsloth
%%capture
!pip install unsloth
!pip install --force-reinstall --no-cache-dir --no-deps git+https://github.com/unslothai/unsloth.git
1
2
3
4
5
6
7
### 登录huggingface,因为我们要下载huggingface上的模型或者训练库
from huggingface_hub import login
from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()

hf_token = user_secrets.get_secret("HF_TOKEN")
login(hf_token)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
### 登录wandb,用于保存微调过程中的日志
import wandb

wb_token = user_secrets.get_secret("WB_TOKEN")

wandb.login(key=wb_token)
run = wandb.init(
    project='Fine-tune-DeepSeek-R1-Distill-Llama-8B on Medical COT Dataset', 
    job_type="training", 
    anonymous="allow"
)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
###配置微调工具unsloth
from unsloth import FastLanguageModel

# 设置最大序列长度,表示模型在一次推理交互中,可以接受的最大token数
max_seq_length = 2048  
# 定义数据类型,设置为None表示将自动选择合适的数据类型(通常根据环境或模型默认值决定)。
dtype = None 
# 启用4位加载模式,可提高模型加载速度,但需要确保硬件支持4位精度。
load_in_4bit = True


model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/DeepSeek-R1-Distill-Llama-8B",
    max_seq_length = max_seq_length,
    dtype = dtype,
    load_in_4bit = load_in_4bit, 
)

### model_name = "unsloth/DeepSeek-R1-Distill-Llama-8B",表示使用的model。这个模型需要是kaggle支持的。
### 具体参考 https://www.kaggle.com/models
### 如果我们调用的是huggingface上的模型,需要设置一个token参数,用于访问huggingface时的校验。
1
FastLanguageModel.for_inference(model)  # 启用推理模式,优化模型的推理速度

运行成功,看结果

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
###测试模型是否正常

question = "请问如何证明根号2是无理数?"## 先把问题用分词器 变为 数字,能让大模型理解的数字
inputs = tokenizer([question], return_tensors="pt").to("cuda")

## 模型进行推理
outputs = model.generate(
    input_ids=inputs.input_ids,
    max_new_tokens=1200,
    use_cache=True,
)

##对推理进行进行解码,解码成我们能看得懂的文字
response = tokenizer.batch_decode(outputs)

##打印结果
print(response[0])


###输出内容:
<beginofsentence>请问如何证明根号2是无理数这是一个经典的问题不过我需要详细地一步步思考

首先我应该回顾一下什么是有理数和无理数有理数是可以表示为两个整数相除的数也就是说a/b其中a和b
是整数且b不等于0无理数则是不能表示为这样的形式的数

那么根号2是否为有理数呢我记得根号2是无理数但需要证明这一点

一种常见的证明方法是假设根号2是有理数然后导出矛盾从而证明它是无理数

假设根号2是有理数那么根据定义存在整数a和b其中b不等于0),使得

2 = a/b

其中a和b是最简整数即没有公因数且分数无法再约分

然后我们可以将这个等式两边同时平方得到

(2)^2 = (a/b)^2

也就是

2 =/
接下来我们可以将等式两边同时乘以b²得到

2=
这说明a²是2的倍数因为a²=2那么a²必须是偶数因为它等于2乘以另一个整数b²那么a²是偶数
意味着a本身必须是偶数因为如果一个数的平方是偶数那这个数必须是偶数奇数的平方是奇数

所以假设a是偶数那我们可以将a表示为2k其中k是一个整数那么a=2k代入上式

= (2k)^2 = 4
于是原来的等式2 =/ b²变为

2 = 4/
然后两边同时乘以b²得到

2= 4
两边同时除以2得到

= 2
这说明b²也是2的倍数因此b也是偶数因为同样的道理如果一个数的平方是偶数那么这个数本身必须是偶数

所以假设根号2是有理数那么a和b都是偶数存在公因数这与我们最初的假设矛盾因为我们假设a和b是最
简整数没有公因数

因此假设根号2是有理数会导致矛盾所以根号2是无理数

另一种思考方式是考虑任何有理数的平方都是有理数或者说如果一个数是有理数那么它的平方也是有理数
反过来如果一个数是无理数那么它的平方可能是有理数或者无理数例如2的平方是2是有理数

所以回到问题假设2 = a/b是最简形式那么a和b都是整数且互质即没有公因数然后平方两边
得到2 =/进而得到a² = 2这意味着a必须是偶数设为2k代入得4k² = 2即2k² =
这意味着b也是偶数这与a和b互质矛盾因此2是无理数

总结一下关键点在于假设2是有理数那么a和b都是偶数这与互质的条件矛盾所以2是无理数

我觉得这个过程没有问题但为了确保万无一失我可以再检查一下是否有其他可能的证明方法或者是否有遗漏的点

比如是否可以用数学归纳法或者其他方法来证明2是无理数不过我觉得上述的方法已经很直接了

另外是否有可能用数论的方法比如考虑平方数和平方无关数的概念可能有点复杂不过我觉得基本的假设和推导
已经足够

总之我的结论是根号2是无理数因为假设它是有理数会导致矛盾
</think>

根号2是无理数因为假设它是有理数会导致矛盾具体推理如下

1. **假设**:√2 = a/b其中a和b是互质的整数且b  0

2. **平方两边**(2)² = (a/b)²  2 =/

3. **整理等式**2== 2

4. **分析a和b的奇偶性**
   - 因为a² = 2a²是偶数所以a必须是偶数设a = 2kk为整数
   - 代入a = 2k得(2k)² = 4= 2 2=
   - 因此b²也是偶数b也必须是偶数

5. **矛盾**既然a和b都是偶数说明它们有一个公因数2这与最初的假设a和b互质矛盾
6. **结论**因此,√2是无理数
整个推导过程十分严谨,以后用它来辅导我家孩子的小学和初中作业应该问题不大,下一节,我们正式开始微调一个大模型。