1.6 环境配置之Jupyter Notebook
什么是 jupyter notebook
经过前几个章节的准备,目前已经具备了PyTorch开发环境,但本教程需要照顾初学者使用代码,为初学者提供更佳的代码学习体验。因此,在上篇,主要采用Jupyter Notebook进行代码演示。
注意:Jupyter Notebook 建议仅用于学习目的,不推荐用于项目开发。
因为notebook自身定位决定的,先来看看jupyter notebook 的定义“The Jupyter Notebook is a web application for creating and sharing documents that contain code, visualizations, and text. It can be used for data science, statistical modeling, machine learning, and much more.”——官网
Jupyter notebook 是一个网页应用,在这个网页上可以编写代码、做可视化、写文本,这就是非常好的教学展示平台。可以在上面进行概念描述、配上代码、运行结果,并且可以按小段进行代码运行,给用户更多的交互体验,便于用户理解代码细节。
基于此,本书上篇主要采用notebook进行代码讲解,到了中篇,基于完整的项目代码框架进行应用开发。
关于jupyter与jupyter notebook的关系,请大家查看官网(以下开始,notebook 指代 jupyter notebook)
notebook 运行逻辑
Jupyter Notebook不仅仅是一个简单的web应用程序,它还需要关联指定的kernel,用于执行我们的代码。相信刚接触notebook的朋友大多都被notebook, kernel的概念搞的一头雾水。如果上述概念理不清楚,就更不清楚如何配置kernel,选择指定的虚拟环境了。
下面,我们先来看看notebook的结构
图中左边是用户写的代码,传输到中间的Jupyter server, server本身不能执行代码,server把代码传给Kernel,Kernel才是实际执行代码的组件,执行代码的地方。Kernel执行完代码,把结果返回给server,再返回到用户的网页。
从图中可以看出Kernel不仅可以是python.exe,也可以是其他语言的解释器,如Julia, R等,更多kernel可以看支持的kernel列表.
通过上述示意图我们就知道了,在pytorch开发中,kernel其实就是某一个python解释器——python.exe,我们需要为当前的notebook配置相应的kernel,来进入相应的虚拟环境,这样才能运行代码。
notebook 安装
理清概念,下面进行notebook安装,目标是正确调用pytorch_1.10_gpu这个虚拟环境来执行notebook上的代码。
安装过程分三步:
进入虚拟环境:conda activate pytorch_1.10_gpu
安装ipykernel工具包(安装jupyter): pip install jupyter
添加kernel到notebook: python -m ipykernel install --user --name pytorch_1.10_gpu
(意思是,将python这个kernel添加到jupyter的kernel中,由于当前已经在虚拟环境中,所以第一个python表示的含义是:D:\Anaconda_data\envs\pytorch_1.10_gpu\python.exe;而pytorch_1.10_gpu是kernel的别名,用于区分不同的kernel,这里建议与虚拟环境名称保持一致就好)
启动
在命令行中执行jupyter notebook就可以打开web应用了,网址为:http://localhost:8888; 这里默认端口为8888,如果再次启动一个jupyter notebook,可以看到端口号变为了8889,即它是另外一个web服务。
进入之后,我们可以看到有一个根目录,我们需要找到我们的notebook文件进行打开,这里有一个小技巧,就是进入到指定文件夹后,再运行notebook,这样notebook的路径就进入了想要的文件夹。
配置kernel
我们进入 chapter-1/02-notebook-demo.ipynb,点击run,可能会出现以下错误
--------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) <ipython-input-1-4e3917ed4a01> in <module> 7 """ 8 ----> 9 import torch 10 11 print("Hello World, Hello PyTorch {}".format(torch.__version__)) ModuleNotFoundError: No module named 'torch'
告诉我们找不到torch这个包,这很明显,使用的kernel不是我们的D:\Anaconda_data\envs\pytorch_1.10_gpu\python.exe。
下面我们来设置一下,方法很简单:
重新运行,将看到以下信息,表明notebook的环境就配置好了。
Hello World, Hello PyTorch 1.10.1+cu102 CUDA is available:True, version is 10.2 device_name: NVIDIA GeForce GTX 1660 Ti with Max-Q Design
实用插件——jupyter_contrib_nbextensions
原生的notebook还是缺点意思,这里推荐大家安装jupyter_contrib_nbextensions插件,jupyter_contrib_nbextensions提供了非常丰富的功能,例如代码折叠、分段折叠、代码自动补全、字体大小、行号显示、目录索引等等,详见下图
插件安装十分简单,打开命令窗,进入虚拟环境,分别依次执行 :
pip install jupyter_contrib_nbextensions jupyter contrib nbextension install --user
然后重启notebook,就可以看到导航栏里有Nbextensions,大家可以根据自己的喜好进行调整,更多内容请查看Github
Notebook 快速上手
notebook所使用的文件格式为.ipynb,jupyter会将.ipynb转为json进行保存,这样便于版本记录以及分享。
例如下图是用sublime打开的 02-notebook-demo.ipynb
下面,我们来研究notebook界面和常用的操作。
界面中需要认识的几个模块分别是:菜单栏、工具栏、单元格(cell)
菜单栏:用得最多的是Kernel,用于中断程序、重启解释器环境、切换解释器等;其它按键顾名思义。
工具栏:一些功能的按钮,高手都是用快捷键的。
单元格:这就是承载信息的地方,cell可分为code cells, markdown cells, raw cells。用得最多的是code cells和markdown cells。
右上角有一个小圆圈,用于观察当前kernel运行状态,如果是实心的,表明kernel正在运行某个cell,被运行的cell以及等待运行的cell的左边会有一个*
notebook 的两种模式
Notebook中的单元,有两种模式:命令模式(Command Mode)与编辑模式(Edit Mode),在不同模式下我们可以进行不同的操作。
命令模式:cell的边框为蓝色,此时可对cell进行操作。在编辑模式下,按esc
键进入命令模式。
编辑模式:cell的边框为绿色,此时可在单元格内编辑代码或文档。在命令模式下,按enter
或return
键进入编辑模式。
常用快捷键
在命令模式下,按下“h”键,就会弹出快捷键的介绍,但是太多了,不方便初学者使用,这里总结一些常用的,实用的快捷键供大家参考。
命令模式:
插入单元格: A 键上方插入,B 键在下方插入
合并单元格:选中多个单元格,Shift + M
显示行号:L
删除单元格:连续按两次D
剪切单元格:X。 通常我用X代替删除,毕竟只用按一个键,哈哈。
复制粘贴单元格: C/V
撤销删除的单元格:要撤消已删除的单元格,请按 Z 键
编辑模式:
运行单元格:Ctrl + Enter
运行并创建新单元格:Alt + Enter
分割单元格:光标放到想要分割的地方,Ctrl + Shift + -
函数详情:Shift+Tab (注意,要把模块导入才会提示函数详情!)
请大家将以上快捷键都试用一遍,这些是高频快捷键,下面给大家列举所有快捷键,请收藏。
下面再介绍两个神奇操作,分别是在单元格中执行shell命令以及magic操作。
请自行尝试!+shell命令进行体会。
magic commands
Magic关键字是 IPython 的高级用法,如%matplotlib将matplolib设置为交互式
%和%%分别代表 行Magic命令 和 单元格Magic命令
演示一个魔法命令 %%timeit
%%timeit
a = []
for i in range(10):
a.append(i)
858 ns ± 50.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
表示将代码段运行了100万次,并统计运行时间。
推荐阅读
- pycharm中使用jupyter notebook:Jupyter notebook support
- 更多的magic commands请看这里Jupyter 魔术命令(magic commands)
更多技巧推荐大家看看Jupyter Notebook 有哪些技巧?
更多官方信息请查看Jupyter Notebook docs