102. Pytorch环境配置
Pytorch各个版本
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" |
在服务器上的sudo用户安装了anaconda,假设现在配置了虚拟的环境pytorch,需要怎么设置配置文件,才能保证连接服务器的别的标准用户(不具有sudo权限)怎么可以用到这个环境.
建议使用国内源,例如清华大学开源软件镜像站。下载对应架构的安装包,例如 Anaconda3-2022.05-Linux-x86_64.sh。注意下载的是 anaconda3。下面假定你在 root 用户中执行指令,并且之前没有安装过 anaconda。
运行下载的文件
通过 chmod +x
为它增加执行权限
回车开始安装
阅读并输入 yes
指定安装目录,例如 /opt/anaconda3
. (不要放在 root 根目录(~
)下。)
等待安装完成
为了使 anaconda 的文件仍归 root 所有,我们将新建一个用户组来为其余用户提供访问权限
1 | groupadd condagroup # 新建一个名为 condagroup 的组;可以使用其它名称 |
接下来,为了确保其余用户可以正确地在自己的目录中使用 -n <name>
新建环境,还要创建系统级的 anaconda 配置文件。在安装目录下(/opt/anaconda3
)新建.condarc
文件并写入
1 | envs_dirs: |
根据 Conda configuration,envs_dirs是搜索命名环境的目录列表。创建新的命名环境时将放置在第一个可写位置,因此 root 用户将默认创建在安装目录下,成为共享环境,而其余用户会创建在自己的主目录中。
关于更多的管理选项,参见 Administering a multi-user conda installation。
你可能会想把这个文件的权限设为 644来避免被其余用户改动。这也是默认行为,因为 root 用户的默认 umask 是 0022。我们接下来将介绍这个 umask 可能带来的问题。
umask 控制新建文件的权限,简单来说是对指定的权限位进行排除。详细信息参见它的维基百科。
前述文件共享的机制是通过组读写权限完成的,意味着 anaconda 的文件需要有用户组的读与写权限。普通用户的默认 umask 是 0002,提供了用户组写仅限,但 root 用户的0022并没有。因此在使用 root 用户创建共享环境前需要修改 umask。
1 | umask 0002 |
否则会导致其它用户无权访问某些新下载的包的缓存等问题。在这种情况下,可以找到相应的文件并为其附加用户组写权限chmod g+w。
现在你已经安装好了想要的 anaconda。如果有新用户,只需将其加入condagroup用户组,即可使用共享环境或创建新环境。
以普通用户执行如下操作, 但是需要在所有的权限设置完毕之后方可使用
运行命令 eval "$(/opt/anaconda3/bin/conda shell.<YOUR_SHELL_NAME> hook)"
如: eval "$(/opt/anaconda3/bin/conda shell.zsh hook)"
运行命令 conda init
或 conda init <YOUR_SHELL_NAME>
注:
conda init
好像只会修改.bashrc
文件
设置关闭自启动base环境
1 | conda config --set auto_activate_base false |
或者修改文件 ~/.condarc
1 | auto_activate_base: false |
以root用户进行如下操作
使用vim打开 /etc/profile
, 在末尾添加
1 | export PATH=/opt/anaconda3/bin:$PATH |
目的是为了让各用户的终端都能找到conda并运行。如果你安装在其它位置,请对应地更改目录值(下同)
运行 source /etc/profile
应用这项更改
vim ~/.bashrc
在最后一行添加:
1 | export PATH="/opt/anaconda3/bin:$PATH" |
用来激活环境变量
1 | source ~/.bashrc |
激活:
source activate
conda activate
退出激活:
source deactivate
conda deactivate
Q:
conda create
创建的目录不在~/.conda/envs
A: 删除 /opt/anaconda3/envs/.conda_envs_dir_test
文件
参考:
假设环境名为 env_name
, 在env_name环境目录中, 创建文件夹 etc/conda/activate.d
。在该文件夹下,创建 *.sh
(linux/macos) 或 *.bat
(windows) 文件, 将需设置的环境变量或脚本写入其中, 并通过 chmod +x *.sh
添加可执行权限. 当激活虚拟环境时, 该脚本自动运行.
分步骤如下:
在你的虚拟环境的 etc/conda/activate.d/
目录下创建一个脚本文件
1 | conda activate env_name |
编辑env_vars.sh文件,添加你需要的环境变量:
1 | #!/bin/sh |
为 env_vars.sh
添加可执行权限:
1 | chmod +x $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh |
UnicodeEncodeError: ‘ascii’ codec can’t encode character ‘\xe4’ in position 89: ordinal not in range(128)
原因: 字符编码问题
解决方案:
方法1: 临时生效
运行命令
1 | export LANG="en_US.UTF-8" |
再执行你需要执行的命令即可
方法2: 当前用户永久生效
有时 Linux 系统中编码并不能统一使用,而是只针对某用户下才使用该编码,即当使用 FineBI 的时候,在该系统用户下才能使用该编码。因此编辑配置文件时需要在该用户下编辑。
打开 ~/.bash_profile
1 | vim ~/.bash_profile |
在最后一行后面追加:
1 | export LANG="en_US.UTF-8" |
重启终端或运行 source ~/.bash_profile
注:
~/.bash_profile
是每个用户都可使用该文件输入专用于自己使用的 shell 信息。
方法3: 系统级对所有用户永久有效
对整个系统都有效的修改方式,使整个系统都适应于该系统编码。该方法是在系统配置文件中添加编码方式将默认的方式覆盖掉。执行的命令如下:
打开 profile
1 | vim /etc/profile |
打开文件后在最后一行后面追加:
1 | export LANG="en_US.UTF-8" |
重启终端或运行 source /etc/profile
方法4: 使用 locale-gen
和 /etc/locale.conf
当需要生成并设置系统的默认语言环境时使用。
编辑 /etc/locale.gen
,去掉 en_US.UTF-8 UTF-8
以及 zh_CN.UTF-8 UTF-8
行前的注释符号(#
):
1 | vim /etc/locale.gen |
然后使用如下命令生成 locale:
1 | locale-gen |
向 /etc/locale.conf
输入内容:
1 | echo 'LANG=en_US.UTF-8' > /etc/locale.conf |
如果要改变变量的值就用指针,不改变就用变量本身;使用变量本身,那么相当于读取,对原来的数据没有任何影响。
1 | #include <iostream> |
LinkList L
和 LinkList *L
:LinkList *L
,若对指针的值没有改变时,使用 LinkList L
LinkList head;
只是定义了一个 变量名为head
的指针变量,是一个野指针,那么需要在定义的时候进行初始化,即:LinkList head = NULL
head
指向头结点,需要自己 new
一个结构体,将这个结构体的地址赋给 head
insertLinkList
和 deleteLinkList
的异同:insertLinkList
和 deleteLinkList
不论在位置 pos
处插入一个结点还是在pos处删除结点,都是对 pos-1
进行操作。while
循环时,insertLinkList
是以第j个位置为判断对象,而 deleteLinkList
是以第j+1个位置为判断对象的(其中:头结点为第1个位置)。