107. CUDA&cnDNN
Pytorch各个版本
Pytorch各个版本
Ctrl+q
,松开,然后再按 [
PgUp
, PgDn
实现上下翻页q
ps:
ctrl + b + [
,很多人会以为是同时按三个键,但是这样是不行的。
关于快捷指令,首先要认识到的是:tmux的所有指令,都包含同一个前缀,默认为Ctrl+q
,输入完前缀过后,控制台激活,命令按键才能生效。前面tmux会话相关的操作中,我们共用到了两个快捷键Ctrl+q
+ d
、Ctrl+q
+ s
,但这仅仅是冰山一角,欲窥tmux庞大的快捷键体系,请看下表。
Note: prefix:
Ctrl+q
前缀 | 指令 | 描述 |
---|---|---|
Ctrl+q |
? |
显示快捷键帮助文档 |
Ctrl+q |
d |
断开当前会话 |
Ctrl+q |
D |
选择要断开的会话 |
Ctrl+q |
Ctrl+z |
挂起当前会话 |
Ctrl+q |
r |
强制重载当前会话 |
Ctrl+q |
s |
显示会话列表用于选择并切换 |
Ctrl+q |
: |
进入命令行模式,此时可直接输入ls 等命令 |
Ctrl+q |
[ |
进入复制模式,按q 退出 |
Ctrl+q |
] |
粘贴复制模式中复制的文本 |
Ctrl+q |
~ |
列出提示信息缓存 |
Ctrl+q |
$ |
重名名当前会话 |
前缀 | 指令 | 描述 |
---|---|---|
Ctrl+q |
c |
新建窗口 |
Ctrl+q |
& |
关闭当前窗口(关闭前需输入y or n 确认) |
Ctrl+q |
0~9 |
切换到指定窗口 |
Ctrl+q |
p |
切换到上一窗口 |
Ctrl+q |
n |
切换到下一窗口 |
Ctrl+q |
w |
打开窗口列表,用于且切换窗口 |
Ctrl+q |
, |
重命名当前窗口 |
Ctrl+q |
. |
修改当前窗口编号(适用于窗口重新排序) |
Ctrl+q |
f |
快速定位到窗口(输入关键字匹配窗口名称) |
前缀 | 指令 | 描述 |
---|---|---|
Ctrl+q |
" |
当前面板上下一分为二,下侧新建面板 |
Ctrl+q |
% |
当前面板左右一分为二,右侧新建面板 |
Ctrl+q |
x |
关闭当前面板(关闭前需输入y or n 确认) |
Ctrl+q |
z |
最大化当前面板,再重复一次按键后恢复正常(v1.8版本新增) |
Ctrl+q |
! |
将当前面板移动到新的窗口打开(原窗口中存在两个及以上面板有效) |
Ctrl+q |
; |
切换到最后一次使用的面板 |
Ctrl+q |
q |
显示面板编号,在编号消失前输入对应的数字可切换到相应的面板 |
Ctrl+q |
{ |
向前置换当前面板 |
Ctrl+q |
} |
向后置换当前面板 |
Ctrl+q |
Ctrl+o |
顺时针旋转当前窗口中的所有面板 |
Ctrl+q |
方向键 |
移动光标切换面板 |
Ctrl+q |
o |
选择下一面板 |
Ctrl+q |
空格键 |
在自带的面板布局中循环切换 |
Ctrl+q |
Alt+方向键 |
以5个单元格为单位调整当前面板边缘 |
Ctrl+q |
Ctrl+方向键 |
以1个单元格为单位调整当前面板边缘(Mac下被系统快捷键覆盖) |
Ctrl+q |
t |
显示时钟 |
tmux的丝滑分屏功能正是得益于以上系统、窗口、面板的快捷指令,只要你愿意,你就可以解除任意的快捷指令,然后绑上你喜欢的指令,当然这就涉及到它的可配置性了。
快捷键 | 功能 |
---|---|
Ctrl+q % |
竖直拆分屏幕(两个 Shell 分别位于左右) |
Ctrl+q " |
水平拆分屏幕(两个 Shell 分别位于上下) |
Ctrl+q O |
切换到另一个 Shell |
Ctrl+q ? |
查看帮助 |
Ctrl+q d |
断开 tmux 并让其在后台运行(可以使用 tmux attach 重新进入) |
Ctrl+q <arrow key> |
光标切换到其他窗格 <arrow key> 是指向要切换到的窗格的方向键比如切换到下方窗格,就按方向键↓ |
Ctrl+q ; |
光标切换到上一个窗格 |
Ctrl+q o |
光标切换到下一个窗格 |
Ctrl+q { |
当前窗格与上一个窗格交换位置 |
Ctrl+q } |
当前窗格与下一个窗格交换位置 |
Ctrl+q Ctrl+o |
所有窗格向前移动一个位置,第一个窗格变成最后一个窗格 |
Ctrl+q Alt+o |
所有窗格向后移动一个位置,最后一个窗格变成第一个窗格 |
Ctrl+q x |
关闭当前窗格 |
Ctrl+q ! |
将当前窗格拆分为一个独立窗口 |
Ctrl+q z |
当前窗格全屏显示,再使用一次会变回原来大小 |
Ctrl+q Ctrl+<arrow key> |
按箭头方向调整窗格大小 |
Ctrl+q q |
显示窗格编号 |
prefix | Ctrl+q | 激活控制台;此时以下按键生效 |
---|---|---|
系统操作 | ? |
列出所有快捷键;按q返回 |
d |
脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 | |
D |
选择要脱离的会话;在同时开启了多个会话时使用 | |
Ctrl+z |
挂起当前会话 | |
r |
强制重绘未脱离的会话 | |
s |
选择并切换会话;在同时开启了多个会话时使用 | |
: |
进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器 | |
[ |
进入复制模式;此时的操作与vi/emacs相同,按q/Esc退出 | |
~ |
列出提示信息缓存;其中包含了之前tmux返回的各种提示信息 | |
窗口操作 | c |
创建新窗口 |
& |
关闭当前窗口 | |
数字键 |
切换至指定窗口 | |
p |
切换至上一窗口 | |
n |
切换至下一窗口 | |
l |
在前后两个窗口间互相切换 | |
w |
通过窗口列表切换窗口 | |
, |
重命名当前窗口;这样便于识别 | |
. |
修改当前窗口编号;相当于窗口重新排序 | |
f |
在所有窗口中查找指定文本 | |
面板操作 | ” |
将当前面板平分为上下两块 |
% |
将当前面板平分为左右两块 | |
x |
关闭当前面板 | |
! |
将当前面板置于新窗口;即新建一个窗口,其中仅包含当前面板 | |
Ctrl+方向键 |
以1个单元格为单位移动边缘以调整当前面板大小 | |
Alt+方向键 |
以5个单元格为单位移动边缘以调整当前面板大小 | |
Space |
在预置的面板布局中循环切换;依次包括even-horizontal、even-vertical、main-horizontal、main-vertical、tiled | |
q |
显示面板编号 | |
o |
在当前窗口中选择下一面板 | |
方向键 |
移动光标以选择面板 | |
{ |
向前置换当前面板 | |
} |
向后置换当前面板 | |
Alt+o |
逆时针旋转当前窗口的面板 | |
Ctrl+o |
顺时针旋转当前窗口的面板 |
1 | $ tmux new -s <session-name> |
命令
1 | $ tmux ls |
Ctrl+q s
:列出所有会话。
使用会话编号
1 | $ tmux attach -t <session-number> |
使用会话名称
1 | $ tmux attach -t <session-name> |
1 | # 使用会话编号 |
$ tmux rename-session
命令用于重命名会话。
1 | $ tmux rename-session -t <session-number> <new-name> |
上面命令将<session-number>
号会话重命名。
Ctrl+q $
Ctrl+q d
$ tmux detach
tmux外:$ tmux kill-session -t <session-name>
tmux内:
Ctrl-d
<Prefix(ctrl+q)> + :kill-session
1 | tmux kill-server |
vi | emacs | 功能 |
---|---|---|
^ | M-m | 反缩进 |
Escape | C-g | 清除选定内容 |
Enter | M-w | 复制选定内容 |
j | Down | 光标下移 |
h | Left | 光标左移 |
l | Right | 光标右移 |
L | 光标移到尾行 | |
M | M-r | 光标移到中间行 |
H | M-R | 光标移到首行 |
k | Up | 光标上移 |
d | C-u | 删除整行 |
D | C-k | 删除到行末 |
$ | C-e | 移到行尾 |
: | g | 前往指定行 |
C-d | M-Down | 向下滚动半屏 |
C-u | M-Up | 向上滚动半屏 |
C-f | Page down | 下一页 |
w | M-f | 下一个词 |
p | C-y | 粘贴 |
C-b | Page up | 上一页 |
b | M-b | 上一个词 |
q | Escape | 退出 |
C-Down or J | C-Down | 向下翻 |
C-Up or K | C-Up | 向下翻 |
n | n | 继续搜索 |
? | C-r | 向前搜索 |
/ | C-s | 向后搜索 |
0 | C-a | 移到行首 |
Space | C-Space | 开始选中 |
C-t | 字符调序 |
Pytorch各个版本
更改Git的样式
美化
基本配置
在用户根目录下新建一个名为 .minttyrc 的文件,写入以下内容,然后重启 git bash,就能看到美化后的样子了。
1 | $ cd ~ |
复制以下代码到
.minttyrc
:
1 | FontHeight=11 |
更新 git-prompt.d
仅仅是换了一个主题还不够,还需要更改终端提示符,更改 git 安装目录下 etc 目录里面的一个文件即可,这个文件也可以通过绝对路径访问到。
进入
1 | $ cd /etc/profile.d/git-prompt.sh |
复制代码到
git-prompt.sh
1 | if test -f /etc/profile.d/git-sdk.sh |
Clion
中使用头文件定义类,源文件实现导入头文件(
.h
)和源文件(.cpp
)
Note: 只导入 源文件(.cpp
) 也可以
1 | cmake_minimum_required(VERSION 3.15) |
1 | # 遍历项目根目录下所有的 .cpp 文件 |
ElemType.h
1 | #ifndef HCPP_ELEMTYPE_H |
ElemType.cpp
1 | #include "ElemType.h" |
main.cpp
1 | #include <iostream> |
运算符重载:详见 运算符重载
重载意义
函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作;
运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能;
C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。
比如,我们定义两个string类对象a,b后我们之所以可以使用+运算,是因为string类重载了+运算符。
语法
1 | <返回类型说明符> operator <运算符符号>(<参数表>) |
哪些运算符可以被重载,哪些运算符不能被重载
可以被重载的运算符:
算术运算符:
+ , - , * , / , % , ++ , --
位操作运算符:& , | , ~ , ^ , << , >>
逻辑运算符:! , && , ||
比较运算符:< , > , >= , <= , == , !=
赋值运算符:= , += , -= , *= , /= , %= , &= , |= , ^= , <<= , >>=
其他运算符:[] , () , -> , ,(逗号运算符) , new , delete , new[] , delete[] , ->*
不允许的运算符重载:
. , .* , :: , ?: ,siezof
Notes:
运算符重载函数是类的成员函数时
>
要是内部的,必须得是
<=1
个参数,不需要加friend
(友元函数)
1 | <返回类型说明符> <类名>::operator <运算符符号>(<参数表>) |
运算符重载函数不是类的成员函数时
(或者说当运算符函数是非成员函数时
)
friend
(友元函数),不管参数是不是类的对象为什么用 const
和 &
:
const
:
&
(引用):
这样可以避免在函数调用时对实参的一次拷贝,提高了效率。
代码
1 | /** |
暂时未发现 Bug
代码
1 | /** |
<<
和 >>
只能定义友元函数原因
定义为成员函数,那么就隐含this指针了对吧,你要知道重载其实也是一种函数,那么函数就有调用他的对象,如果是成员函数,那么调用他的对象就肯定是想对应的类对象了对吧,但是<<和>>调用的对象肯定只能是cout或者cin对吧,那么久不能定义为成员函数了,只有定义成友元,那么就可以把cin,cout作为一个参数传进你重载的操作符函数里面去了
语法:
在类中:
1 | friend ostream &operator <<(ostream &out, const ElemType &e); |
代码
头文件(.h
)
1 | #ifndef ELEMTYPE_H |
源文件(.cpp
)
1 | #include "ElemType.h" |
JetBrains 家族其他软件的手法相似,按需使用即可,此路不通,找度娘
配置
下载 setting_3.zip, setting_4.zip, setting_5.zip, setting_6.zip, setting_7.zip, setting_8.zip
数字越大,版本越新
打开 Clion
选择: File
- Import setting
选择这个 setting
文件即可(一般全部导入,看个人)
取消开始界面打开默认项目配置
File
- Settings
- Appearance & Behavior
- System Settings
Reopen last project on startup
更改模板注释:
打开:File
- Settings
- Editor
- File and Code Templates
- Includes
下面有一个面板,在面板输入
1 | #if ($HEADER_COMMENTS) |
Clion 多个 main
函数存在
在 CMakeLists.txt
中加入
1 | # 遍历项目根目录下所有的 .cpp 文件 |
为了方便可以自己定义快捷键:(个人用的是: Alt-Shift+R
)
File
- Settings
- Keymap
Reload cmake project
即可参考:
1 | cmake_minimum_required(VERSION 3.15) |
CMakeLists
自动加载
Files
- settings
- Build, Execution, Deployment
- CMake
Automatically reload CMake project on editing
侧边栏无焦点自动隐藏
扳手
View Mode
- Dock Unpinned
汉化步骤
resources-cn.jar
复制到 安装目录下lib文件夹下
快捷键
快捷键 | 含义 | 备注 |
---|---|---|
Ctrl + Shift + U | 大小写切换 | |
Ctrl + Shift + Space | 补全单词 | new后直接键入构造器、构造器内提供构造信息 |
Ctrl + Alt + L | 格式化代码 | |
Ctrl + Shift + Backspace | 回到最后编辑的地方 | |
Ctrl + N | 查找类 | |
Ctrl + F12 | 快速查看类成员 | |
Ctrl + P | 提示参数信息 | |
Ctrl + Alt + B | 查看接口、抽象类的实现类 | |
Ctrl + F7 | 找到某个类、变量、函数等在文中被使用到的的地方 | |
连续点击Shift | 全局搜索 | |
Shift + F6 | 重新命名变量 | |
连续按两次Esc | 搜索框就会消失 | |
Alt + insert | 添加自动代码生成信息 | 新建新的文件 |
Ctrl + j | 插入完整的代码块 | 默认只有 for , iter , itit ,也可以自己在 Setting—>Live Templates 里添加自定义的代码块 |
Ctrl + Alt + -/+ | 展开折叠当前函数、类 | |
Ctrl + Shift + -/+ | 展开折叠所有函数、类 | |
Ctrl + Alt + T | 就可以选择给这些代码包裹上 if , for 等(surround with) |
自动换行
idea设置自动换行其实很简单,只需要进行一步操作就可以了。
看下图:我们只需要在相应的位置加上文件的类型就可以了,比如我们写的类都是.java文件,那么我们只需要加上 *.java就可以实现自动换行了。
JetBrains
学生认证:自行百度
JetBrains
sync配置同步:
Files
- Sync ……
Clion
输出乱码
Ctrl+Shift+Alt+/
选中Registry..
.,然后取消掉 run.processes.with.pty
后面的 √
首先我们把硬件时间(BIOS时间)将默认的UTC改为CST,然后重启,使得两个系统的时间保持一致
sudo timedatectl set-local-rtc 1
sudo reboot
接着我们更新一下系统时间
sudo apt-get install ntpdate
sudo ntpdate time.windows.com
最后我们将时间更新到硬件上,以保证重启后改动不会被还原
这里的代码意思是使用hwclock命令将本地时间localtime从sysclock同步到hwclock: sudo hwclock --localtime --systohc
注意:必须要安装 Python2、Python3,才可以使用
deb安装:sudo dpkg -i <deb文件>
cmd
运行 regedit
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecurityHealthService
DWORD(32位)
值,名为 Start
注意:
- 如果你安装第三方杀软或安全软件,Windows Defender会自动被关闭。
- start的默认值为
3
更改当前不可用的设置
启用快速启动(推荐)
前面的勾即可sudo apt-get install exfat-utils
sudo fdisk -l
sudo ntfsfix /dev/sdb1
注意:/dev/sdb1 为移动硬盘的设备名,找到硬盘size对应的设备名
locate <文件名>
步骤:
软件和更新
软件和更新窗口
Ubuntu软件
选项卡下的 其他站点
mirrors.aliyun.com
,然后点击 选择服务器包、模块、类、函数、变量
其中:
py
文件区分不同包的同名模块:包名.模块名
形成的模块的路径叫做命名空间
一个包下面可以有子包,模块可以和包平级
普通文件夹想要变成包必须要有init.py文件__init__.py
本身也是一个模块,可以不写内容只是标注包
特殊地,__init__.py
模块的名字就是包名
__init__.py
用途__init__.py
该文件的作用就是相当于把自身整个文件夹当作一个包来管理,每当有外部import的时候,就会自动执行里面的函数。
对于重复的定义需要从其他模块里引用。
利用import 模块名
导入
1 | # PackageTest1.Test1 |
import导入的总是模块,需要用模块名.变量名的方法引用
可以用as简化书写
1 | # PackageTest1.Test1 |
同级目录可以直接导入模块
优点是可以一眼看出属于哪个模块
1 | # PackageTest1.Test2 |
可以使用
from 包 import 模块
导入模块
导入时使用模块.变量
导入大量变量时用*
:
1 | # PackageTest1.Test1 |
*
1 | # PackageTest1.Test1 |
*
导入时,导入的是在所在包中 __init__.py
存在的变量initTest
PackageTest1
__init__.py
Test1.py
Test2.py
Test.py
其中:
PackageTest1.__init__.py
1 | import pandas as pd |
PackageTest1.Test1.py
1 | from __init__ import * # 可以使用所在包中的 __init__ 导入大量的包 |
Test.py
1 | from PackageTest1 import * # 因为 PackageTest1.__init__ 中只有 pd, np 这两个变量,因此使用 * 只导入进来了 pd, np |
PackageTest1.__init__
中导入 Test1
模块、类Test1
模块PackageTest1.__init__.py
中添加 import PackageTest1.Test1
就可以在 Test.py
中使用 Test1.Test1()
创建 Test1
类了。Test1
类PackageTest1.__init__.py
中添加 from PackageTest1.Test1 import Test1
就可以在 Test.py
中使用 Test1()
创建 Test1
类了。PackageTest1.__init__.py
中添加 import PackageTest1.Test1
是错误的,会报错: ModuleNotFoundError: No module named 'PackageTest1.Test1.Test1'; 'PackageTest1.Test1' is not a package
__init__.py
用法__init__.py
会首先被自动执行,类似于构造函数__init__.py
的应用场景1 | # PackageTest1.__init__.py |
此时引用因为不是用的
*
, 所以必须使用包.类.成员函数
进行调用。
pacgage1
__init__.py
test1.py
test2.py
test3.py
test3
调用 package1
,而 test1
调用 test2
,此时,在 package1.__init__.py
中添加路径,如下:
1 | import sys |
if __name__ == '__main__'
则不会执行该代码块中的代码CUDA
和 cudnn
安装 CUDA
查看显卡信息,[CUDA版本和驱动版本的对照表]
下载对应的cuda,[CUDA各个版本下载地址]
最高的版本:低事实最高版本一个级别
最好低最高版本低几个版本。
安装cuda,勾掉以下3个:
NVIDIA Geforce Experience ……
CUDA
下 Visual Studio ……
driver ……
下 display driver
其他默认即可
注意:版本对照等重要信息见文末的参考资料
问题:我的显卡比10.1大,但是没问题,
安装 cudnn
CUDA
对应的版本(建议不要下载最新的,看好官方文档在决定下载哪个)点击这里下载cudnn
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2
下添加环境变量,详见参考资料
Tensorflow
Tensorflow-cpu
版:1 | pip install --upgrade tensorflow |
Tensorflow-gpu
版:1 | pip install --upgrade tensorflow-gpu |
1 | Traceback (most recent call last): |
vs2019
即可:通用 Windows 平台开发
.NET 桌面开发
ASP.NET 和 Web开发
GPU
:tf.test.is_gpu_available()
1 | from tensorflow.python.client import device_lib |
CUDA
查看显卡信息
1 | $ nvidia-smi |
会得到以下信息:
其中:
版本 | |
---|---|
显卡驱动 | 450.51.05 |
cuda | 11.0 |
Note:
- 若没有安装过NVIDIA,那么
nvidia-smi
会报错,可直接安装cuda,因为cuda会自动安装显卡驱动- 若安装完cuda,
nvidia-smi
仍报错,那么重启就可以了。
下载cuda [点击这里下载]
注意:选择和自己系统相匹配的(在下安装的是11.0)
网站会给出相应的安装命令,如下:
1 | wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin |
Note: 若
wget http://developer.download.nvidia.com/compute/cuda/11.0.2/local_installers/cuda-repo-ubuntu1804-11-0-local_11.0.2-450.51.05-1_amd64.deb
下载太慢,那么用浏览器打开wget
后面的网址即可浏览器下载。
添加 cudnn
环境变量
Note: 一定要下载与cuda相对应的版本,如:
cuDNN Library for Linux (x86_64)
配置环境变量
在 .bashrc
添加如下:
1 | export PATH="/usr/local/<cuda-11.0>/bin/:$PATH" |
查看cuda和cudnn是否安装成功
1 | nvcc -V |
如果安装成功会得到以下信息:
1 | nvcc: NVIDIA (R) Cuda compiler driver |
安装 tensorflow
点击这里查看github教程
PS: 最好使用科学上网
检测 tensorflow-gpu
是否安装成功
1 | import tensorflow as tf |
1 | nvidia-smi |
目前CUDA版本为11.6,如下图所示,显卡驱动为510.47.03(根据下面的对照表,降级成CUDA10.2没问题)
1 | $ uname |
见[Table 3 CUDA Toolkit and Corresponding Driver Versions]
如上图所示,像CUDA10.2版本,需要440.33以上的显卡驱动。例如,如果你通过nvidia-smi命令获得的显卡驱动号大于440.33,你可以将CUDA 11降到10.2是完全没有问题的。而如果你的显卡驱动号是396.26,那么你只能在CUDA7/8/9上进行切换。
因此显卡驱动总是越高越好,依赖关系为:
下载网址:[https://developer.nvidia.com/cuda-toolkit-archive]
运行如下wget命令在服务器安装cuda的目录下:
将下载好的文件执行以下操作:
chmod 755 cuda_10.2.89_440.33.01_linux.run
更改文件的执行权限。sh cuda_10.2.89_440.33.01_linux.run
Option
回车进入前提:如下使用的两个目录需要先创建
/home/<username>/cuda-10.2/
/home/<username>/cuda-10.2/mylib/
PS: 这两个目录可以随便换
先选择Toolkit Options
回车进入
选择Change Toolkit Install Path
回车,输入自定义的CUDA安装目录:
1 | /home/<username>/cuda-10.2/ |
1 | /home/<username>/cuda-10.2/mylib |
此时nvcc还是显示原来的CUDA版本,还需要修改本地文件,如下:
修改命令相关参数,执行如下命令:
1 | vim ~/.bashrc |
在最下方添加刚刚安装cuda的路径:
1 | export PATH="/home/<username>/<cuda-10.2>/bin:$PATH" |
之前的CUDA路径可以注释掉,方便之后使用
![]()
保存之后,执行以下命令,使配置生效:
1 | source~/.bashrc |
查看效果:nvcc -V
显示CUDA 10.2,已经安装成功
1 | $ ln -s /home/<username>/<cuda-10.2> /usr/local/cuda |
PS: /usr/local/cuda 目录可以换
修改命令相关参数,执行如下命令:
1 | vim ~/.bashrc |
在最下方添加刚刚安装cuda的路径:
1 | export PATH="/usr/local/cuda/bin:$PATH" |