AB
AiBoss
Tutorials

fast.ai

Tutorials

用 fast.ai 2.0 安装框架并跑通第一个深度学习脚本

fast.ai 2.0 把深度学习框架与免费课程打包在一起,重代码、轻数学,适合想直接上手训练模型的初学者。本文从环境准备讲起,给出 pip、conda、可编辑源码三种安装方式,说明 fastcore、fastscript、fastgpu 三个核心库的用法,并用一个从零跑通的最小示例串起完整流程。

fast.ai 是一个把深度学习框架和配套课程打包在一起的项目,它的取向是重代码、轻数学:不要求读者先把线性代数和微积分啃完,而是直接调用高层 API 完成图像分类、自然语言处理、生成对抗网络这类任务。它适合两类人:一类是完全没有机器学习基础、想通过动手跑通模型来建立直觉的初学者;另一类是有一定 Python 基础、希望用尽量少的代码把想法验证一遍的开发者。如果你需要的是系统性的数学推导,这个框架不是为那个目标设计的。本文涉及的命令与安装方式,可以在 fast.ai 这个工具条目下对照查看。

需要先说明一点:fast.ai 的课程内容、框架版本和配套书籍的获取方式会随时间变化,本文只讲操作路径,具体的版本号、可用性、价格请以官网当前信息为准。

准备工作

Python 与 PyTorch

fast.ai 构建在 PyTorch 之上,所有安装方式都要求机器上已经装好较新版本的 Python 和 PyTorch。这两者是前置条件,不是 fast.ai 安装命令会顺带解决的事情。建议先确认 Python 能正常调用,再确认 PyTorch 能导入并识别到可用的计算设备,然后再装 fast.ai。顺序反了的话,装完 fast.ai 导入时报错,很难判断问题出在哪一层。

三种环境选择

按投入程度从低到高,可以这样选:

  • 完全不想装环境:用 Google Colab,打开笔记本后把运行时切换成 GPU 模式。这是最省事的路径,代价是受限于 Colab 的会话时长和资源配额。
  • 本地跑通即可:用 pip 或 conda 装发布版,一条命令完成。
  • 打算改框架源码:装可编辑版本,从源码仓库克隆后以开发模式安装。

课程与资料的获取

fast.ai 2.0 的课程分为两大部分。第一部分是「深度学习任务速成」,共 7 节课,依次覆盖图像分类、随机梯度下降入门、多标签分类、自然语言处理、从零实现反向传播的神经网络、卷积神经网络、生成对抗网络。第二部分是「深度学习基础」,同样 7 节课,从深度神经网络的结构讲起,涉及训练过程、模型内部结构、数据块 API 等内容。

课程页面通常是左边视频、右边本节提纲,并附有其他学习者的笔记链接和扩展资料。全部课程视频提供简体中文字幕,这对中文读者是一个实际的门槛降低。如果已经有基础,可以直接从第二部分开始。

有一个容易踩空的地方:2.0 版本移除了 1.x 中的机器学习入门内容。如果你需要那部分,只能回到 1.x 版本去学,1.x 仍在维护更新。另外,官方推荐配合配套书籍《程序员实用深度学习教程》一起学,实体书和免费的 Jupyter Notebook 版本都可以获取,具体渠道以官网当前信息为准。

操作步骤

第一步:用 pip 安装发布版

最直接的方式是一条命令:

pip install fastai

这条命令会把 fastai 及其依赖装进当前 Python 环境。装完后在 Python 里 import fastai 不报错,就说明基础安装成功。如果同时维护多个项目,建议先建虚拟环境再装,避免不同项目的依赖互相覆盖。

第二步:用 conda 安装

如果你用 conda 管理环境,走 conda 渠道,需要同时指定 fastai 和 pytorch 两个 channel:

conda install -c fastai -c pytorch fastai

两个 channel 的顺序有意义,fastai 在前、pytorch 在后。conda 会从这两个来源解析依赖,装出来的 PyTorch 版本与 fastai 是匹配的。不要只写 fastai 一个 channel,否则可能解析不到合适的 PyTorch 构建。

第三步:安装可编辑的开发版本

如果你打算读框架源码、改代码、给项目提改动,就需要可编辑安装。先克隆仓库,注意要带上子模块,然后以开发模式安装:

git clone --recurse-submodules <仓库地址>
cd fastai
pip install -e "fastai[dev]"

这里有两个细节。第一,--recurse-submodules 不能省,仓库依赖子模块,漏掉会导致后续构建失败。第二,-e 表示可编辑模式,装完之后你对源码目录的修改会直接生效,不需要重新安装。[dev] 是附加依赖组,会一并装上开发、测试所需的包。

第四步:认识 fastcore

2.0 的核心是三个库:fastcore、fastscript、fastgpu。先看 fastcore。它利用 Python 的灵活性,把其他语言里一些好用的特性搬了过来,同时补上了 Python 标准库里一些用起来不顺手的地方。

具体包括:来自 Julia 的多重调度(multiple dispatch),即同一个函数名可以按参数类型分派到不同实现;来自 Ruby 的 mixin,用于把一组方法混入类中;来自 Haskell 的 currying 和 binding,用于把多参数函数逐步固定成少参数函数。此外它还简化了并行处理这类标准库中比较繁琐的部分。这些能力在写训练循环、组织数据管道时会反复用到,值得单独花时间熟悉。

第五步:用 fastscript 写命令行脚本

fastscript 是为快速编写脚本设计的。Python 自带的 argparse 也能做命令行参数解析,但一旦要支持多个参数、自动生成帮助信息、处理类型转换,代码就会变得冗长。fastscript 把这些收进了一个装饰器里。

下面是一个完整可运行的例子:

from fastscript import *

@call_parse
def main(msg:Param("The message", str),
         upper:Param("Convert to uppercase?", bool_arg)=False):
    print(msg.upper() if upper else msg)

要点在于 @call_parse 装饰器:它读取函数签名,把每个带 Param 注解的参数自动变成命令行参数,注解里的字符串成为帮助文本,类型注解决定解析方式,带默认值的参数成为可选参数。函数体本身不需要处理任何解析逻辑。

直接运行这个脚本而不给参数,会看到自动生成的用法提示和缺失参数报错:

$ python examples/test_fastscript.py
usage: test_fastscript.py [-h] [--upper UPPER] msg
test_fastscript.py: error: the following arguments are required: msg

注意 -h 是自动加上的,--upper 因为带了默认值所以是可选的,而 msg 没有默认值,因此是必填的。这就是 fastscript 相对 argparse 省下来的那部分工作。

第六步:用 fastgpu 排队跑脚本

fastgpu 只提供一个命令:fastgpu_poll。它的作用是轮询一个目录,检查里面有没有待运行的脚本,然后把它们放到第一个可用的 GPU 上执行。

行为规则有三条,都很直观:

  • 没有可用 GPU 时,进入等待状态,不报错退出。
  • 有一个以上 GPU 可用时,多个脚本并行运行,每个 GPU 跑一个。
  • 整个过程不需要人工干预,也没有并行调度的额外开销。

这实际上是最省事的模型简化测试方式:把要跑的脚本丢进目录,让 fastgpu_poll 去分配,机器上有几张卡就用几张卡。适合那种「同一份代码换几组超参数各跑一遍」的场景。

一个完整示例

下面把前面的步骤串成一个从零到跑通的最小流程。假设你在一台已经装好 Python 和 PyTorch 的机器上,或者打开了一个 Colab 笔记本并已切换到 GPU 运行时。

第一步,安装框架。

pip install fastai

第二步,验证导入。

python -c "import fastai; print(fastai.__version__)"

能打印出版本号,说明安装链路是通的。如果这一步报错,回到准备工作检查 PyTorch 是否装好。

第三步,写一个带命令行参数的小脚本。新建文件 train_demo.py:

from fastscript import *

@call_parse
def main(msg:Param("The message", str),
         upper:Param("Convert to uppercase?", bool_arg)=False):
    print(msg.upper() if upper else msg)

if __name__ == "__main__":
    main()

第四步,分别以两种方式运行。

python train_demo.py "hello fastai"
python train_demo.py "hello fastai" --upper True

第一条输出原样字符串,第二条输出全大写。这一步验证的是 fastscript 的参数解析链路,跑通之后,把 main 的函数体换成真正的训练代码即可,命令行接口不用重写。

第五步,批量跑多组配置。把若干份脚本放进同一个目录,然后启动轮询:

fastgpu_poll

命令会扫描目录,把待运行脚本分配到可用 GPU 上。没有空闲卡时它会等,有卡时自动并行。观察输出确认每个脚本都拿到了 GPU 并正常结束。

到这里,安装、脚本化、批量调度三条链路都验证过了。接下来就是回到课程,按「深度学习任务速成」的 7 节课顺序往下走,每节课配套的笔记本可以直接在 Colab 里打开运行。

注意事项

版本选择上的取舍

2.0 移除了 1.x 中的机器学习入门内容。如果你完全没有机器学习基础,又希望从传统机器学习讲起,需要去学 1.x 的对应课程。1.x 仍在维护,但新特性和新课程都在 2.0 上。这是一个明确的取舍,不是可以绕过的细节。

安装顺序不能颠倒

三种安装方式都建立在「已装好较新版本 Python 和 PyTorch」这个前提上。fast.ai 的安装命令不会替你解决 PyTorch 的版本与 CUDA 匹配问题。先装 PyTorch 并确认它能用,再装 fast.ai,出问题时排查范围会小很多。

conda 的两个 channel 都要写

conda install -c fastai -c pytorch fastai 里的两个 -c 缺一不可。只写 fastai 一个来源时,依赖解析可能找不到匹配的 PyTorch 构建,表现为求解失败或装出不适配的组合。

克隆源码别漏子模块

可编辑安装时,git clone --recurse-submodules 中的子模块参数必须带上。漏掉的话,仓库目录看起来是完整的,但构建或导入阶段会失败,而且报错信息通常不会直接指向「子模块缺失」。

Colab 的运行时设置

用 Colab 时,笔记本加载完成后要手动把运行时类型切换成 GPU。默认是 CPU 运行时,不切换的话代码能跑,但训练速度会慢到无法用于实际练习。另外 Colab 的会话有资源与时长限制,长时间训练任务需要自己做好检查点保存。

fastgpu_poll 的适用边界

它做的是「目录轮询 + 空闲卡分配」,适合彼此独立、不需要通信的脚本。如果你的任务需要多卡协同训练(例如分布式数据并行),这个命令解决不了,需要另找方案。它的价值在于零配置地榨干机器上的空闲 GPU,而不是替代分布式训练框架。

课程与书籍信息的时效性

课程结构、视频字幕、配套书籍的获取渠道都属于会变动的信息。本文描述的是 2.0 发布时的课程划分,实际学习前请以官网当前信息为准,确认课程列表和资料入口是否仍然一致。