download-model.ipynb 说明文档这份 notebook 的任务非常单纯:
tiny-gpt2 下载到本地目录它和 00_check_env.ipynb 的后半部分其实是同一类工作,只是这里把“下载模型”单独拿出来了。
如果你已经在课程镜像里看到了:
/root/course_lora/models/tiny-gpt2那通常就不用再重复运行这份 notebook。
所以它更像:
你可以这样理解:
00_check_env.ipynb
download-model.ipynb
01_lora_demo.ipynb
也就是说,这份 notebook 并不直接训练模型,它只是准备训练所需的本地权重。
# 下载模型
### tiny-gpt2 模型已经下载到了 /root/course_lora/models/tiny-gpt2 下面,不需要再下载了哈。这一格其实已经把最重要的信息告诉你了:
如果你本地已经有:
config.jsonmodel.safetensorstokenizer.json那你通常可以跳过这份 notebook。
代码:
# 设置证书,访问 HuggingFace
# 命令行:ind /etc/ssl /usr/local/share/ca-certificates /etc/ca-certificates -type f \( -name "*.crt" -o -name "*.pem" \) 2>/dev/null | head -50
import os
ca_path = "/etc/ssl/certs/ca-certificates.crt" # 改成你实际找到的路径
os.environ["REQUESTS_CA_BUNDLE"] = ca_path
os.environ["CURL_CA_BUNDLE"] = ca_path
os.environ["SSL_CERT_FILE"] = ca_path
print("CA bundle set to:", ca_path)它在解决:
import os导入 os 模块,用来设置环境变量。
ca_path = "/etc/ssl/certs/ca-certificates.crt"指定系统证书文件的位置。
如果你的系统不是这个路径,就需要改成真正存在的证书路径。
os.environ["REQUESTS_CA_BUNDLE"] = ca_path告诉 requests 去哪里找证书。
os.environ["CURL_CA_BUNDLE"] = ca_path告诉 curl 去哪里找证书。
os.environ["SSL_CERT_FILE"] = ca_path告诉更底层的 SSL 组件去哪里找证书。
print("CA bundle set to:", ca_path)打印当前设置,方便检查。
如果你看到这类报错,它就非常重要:
如果下载本来就正常,这一格通常不会带来额外问题。
代码:
# 设置科学上网,访问 Github 和 HuggingFace
# 命令行:/etc/network_turbo
import subprocess
import os
result = subprocess.run(
'bash -c "source /etc/network_turbo && env | grep proxy"',
shell=True,
capture_output=True,
text=True
)
for line in result.stdout.splitlines():
if '=' in line:
var, value = line.split('=', 1)
os.environ[var] = value
print("Proxy variables loaded:")
for k in ["http_proxy", "https_proxy", "HTTP_PROXY", "HTTPS_PROXY"]:
print(k, os.environ.get(k))它在尝试把系统里已有的代理配置读进当前 notebook。
目的就是:
import subprocess导入 Python 的系统命令执行模块。
result = subprocess.run(...)运行下面这段 shell 命令:
bash -c "source /etc/network_turbo && env | grep proxy"它的意思是:
/etc/network_turboproxy 有关的项shell=True说明传入的是整段 shell 命令。
capture_output=True抓取命令输出,方便后面在 Python 里处理。
text=True把输出按字符串处理,而不是字节流。
for line in result.stdout.splitlines():按行遍历命令输出。
if '=' in line:只有包含 = 的行,才像环境变量赋值。
var, value = line.split('=', 1)把一行拆成:
os.environ[var] = value把这些代理变量写进当前 Python 进程。
print(k, os.environ.get(k))把几个常见代理变量打印出来,方便确认是否真的加载到了。
如果模型下载经常超时、连接失败、访问不到 Hugging Face,它就很有帮助。
代码:
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"它告诉 Hugging Face 相关下载逻辑:
在国内网络环境下,直接访问 Hugging Face 官方站点有时不稳定。
这一步是在做最简单的“下载入口替换”。
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"设置环境变量 HF_ENDPOINT,让后续 from_pretrained(...) 优先用镜像地址。
代码:
# 下载模型,存到本地。
from transformers import AutoTokenizer
model_name = "sshleifer/tiny-gpt2"
save_dir = "/root/course_lora/models/tiny-gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.save_pretrained(save_dir)
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(model_name)
model.save_pretrained(save_dir)这格开始真正下载模型资源,并把它们保存到本地。
它做了两件事:
from transformers import AutoTokenizer导入自动 tokenizer 加载器。
model_name = "sshleifer/tiny-gpt2"指定模型名字。
这里选的是非常小的 tiny-gpt2,目的不是训练强模型,而是:
save_dir = "/root/course_lora/models/tiny-gpt2"定义本地保存目录。
后面课程 notebook 都默认从这个目录读模型。
tokenizer = AutoTokenizer.from_pretrained(model_name)从 Hugging Face 加载 tokenizer。
tokenizer.save_pretrained(save_dir)把 tokenizer 保存到本地目录。
from transformers import AutoModelForCausalLM导入因果语言模型类。
model = AutoModelForCausalLM.from_pretrained(model_name)从 Hugging Face 加载模型权重。
model.save_pretrained(save_dir)把模型权重保存到本地。
在 save_dir 里,通常会看到类似文件:
config.jsongeneration_config.jsonmodel.safetensorstokenizer.jsontokenizer_config.json这说明:
这两格是空的,没有实际作用,可以忽略。
只有在下面这些情况,你才需要主动跑它:
tiny-gpt2 目录不存在如果本地模型已经在,而且后面 notebook 能正常加载,那就可以跳过这份 notebook。