从结果来看,本文的方法依然不能投太多的懒,所以后来笔者就亲自编译了torch 1.9和torchvision 0.9的whl安装文件。 这里详细的编译过程就不赘述,直接列出安装文件,需要的读者可以直接下载安装使用。 注意的是在执行pip操作之前需要安装最新的cuda和cudnn以及最新的驱动,参考博文Ubuntu16.04下如何安装显卡驱动、cuda、cudnn。 以笔者的为例:
+—————————————————————————–+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 1217 G /usr/lib/xorg/Xorg 146MiB | | 0 N/A N/A 1908 G compiz 49MiB | +—————————————————————————–+
pytorch 1.9和torchvision 0.9的安装包链接如下:
链接:https://pan.baidu.com/s/19gDdmkTeL9ThnQ5s2rHcig 提取码:b7me 复制这段内容后打开百度网盘手机App,操作更方便哦
## 以下是原文
本着节约的原则花1000块买了一块k40c的显卡,但是在运行pytorch直接就出现了这个问题:
RuntimeError: CUDA error: no kernel image is available for execution on the device Turns out that PyTorch v1.6.0 dropped support for GPUs with NVIDIA compute capability 3.5 in their prebuilt binaries that you’d get from pip or conda —the stated reason was that supporting these older GPUs would have pushed binary sizes past acceptable limits for distribution.
看来只能试着源码安装。无奈源码安装也遇到了各种问题。于是谷歌一番找到了适合老旧GPU的pytorch安装包。
由于使用pip安装比较简单,这里就直接列出来:
- 仓库地址:https://github.com/nelson-liu/pytorch-manylinux-binaries/releases
- 安装示例:
```
pip install torch==1.8.0+cu111 -f https://nelsonliu.me/files/pytorch/whl/torch_stable.html
```
打开链接'''https://cs.stanford.edu/~nfliu/files/pytorch/whl/torch_stable.html'''可以看到各种版本pytorch+cuda的安装包(比如1.8.0):
torch-1.8.0+cu101-cp36-cp36m-linux_x86_64.whl torch-1.8.0+cu101-cp37-cp37m-linux_x86_64.whl torch-1.8.0+cu101-cp38-cp38-linux_x86_64.whl torch-1.8.0+cu101-cp39-cp39-linux_x86_64.whl torch-1.8.0+cu102-cp36-cp36m-linux_x86_64.whl torch-1.8.0+cu102-cp37-cp37m-linux_x86_64.whl torch-1.8.0+cu102-cp38-cp38-linux_x86_64.whl torch-1.8.0+cu102-cp39-cp39-linux_x86_64.whl torch-1.8.0+cu111-cp36-cp36m-linux_x86_64.whl torch-1.8.0+cu111-cp37-cp37m-linux_x86_64.whl torch-1.8.0+cu111-cp38-cp38-linux_x86_64.whl torch-1.8.0+cu111-cp39-cp39-linux_x86_64.whl ```
本文列举了一些常用的os包和sys包的操作。笔者认为记住一些自带系统包的操作在实际的开发过程中能节省时间。
总结:os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。
出现这个问题是因为~/.ssh/id_rsa
文件的权限给的太宽。
如果有这个提示,可以使用命令使得文件只有读权限:
chmod 400 ~/.ssh/id_rsa
或者如果需要添加写权限
chmod 600 ~/.ssh/id_rsa
完毕。
最近项目需要使用了Docker,结果在使用了之后就停不下来。 Docker对于自动化部署来说真真太方便了。
简而言之,docker是一个用于开发、分发和测试、生产的平台。它最大的优势在于:能够迅速自动化的部署开发的应用。Docker相当于在宿主机上虚拟出了N个独立的应用运行环境,每个应用的环境都是独立的,每个应用也是独立的。
从上图可以看出,Docker的主要包括:
images是Docker中重要的概念之一,相当于Windows的ISO镜像,可以用于安装Windows系统。
比如:docker pull ubuntu
相当于拉取一个ubuntu系统的镜像到本地。可以通过命令行执行’‘docker images’‘查看本地拥有哪些镜像。
container也是Docker中重要的概念之一,相当于安装好了的Windows系统,可以start、pause、stop、restart。比如:docker run ubuntu
相当于安装并启动一个ubuntu系统。通过命令行执行’‘docker ps -a’‘查看所有的容器。
这两个概念在开始的时候不好理解,但是以操作系统的ISO镜像和操作系统去类比会好理解得多。
docker在Ubuntu系统中的安装比较简单,只需要执行下面的命令即可:
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo docker run hello-world
当看到如下输出:
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:1a523af650137b8accdaed439c17d684df61ee4d74feac151b5b337bd29e7eec
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
即表示安装成功了。
常用命令:
如果对命令有疑问可以通过docker --help
命令查看命令的使用。
新建目录test/,然后新建Dockerfile文件,内容如下:
FROM ubuntu:18.04
WORKDIR /code
#RUN 执行命令
RUN apt update --yes && apt upgrade --yes
# 安装python
RUN apt-get install python-dev --yes
COPY . .
# 执行web.py
CMD ["python","web.py"]
web.py文件中写入如下内容:
print('hello')
docker built -t test .
可以看到输出:
Step 17/18 : COPY . .
---> 1ba374f5a1d2
Step 18/18 : CMD ["python","web.py"]
---> Running in 365d4b7fd252
Removing intermediate container 365d4b7fd252
---> 5403a172511d
Successfully built 5403a172511d
Successfully tagged test:latest
表示成功新建了镜像。
$ sudo docker run test
hello
可以看到hello
就是容器的输出,表明容器新建成功。
For Debian and Ubuntu:
$ sudo apt-get install build-essential libssl-dev libffi-dev python-dev
For Fedora and RHEL-derivatives:
$ sudo yum install gcc libffi-devel python-devel openssl-devel
For Alpine Linux:
libffi-dev, openssl-dev and python3-dev
本文的组成:
第一部分解释创建自己的镜像的动机;
第二部分介绍分析的过程
第三部分直接贴出具体的步骤。
一、动机
anaconda提供方便的软件包管理方式,通过它能够很方便的使用众多的开源包。但anaconda对国内用户是相当的不友好,下载速度超级慢;之前国内有众多的镜像源解决了这个问题,但去年的第三方源关闭的风波直接导致国内没有一个国内源能供使用。因而如何创建自己的私人镜像就显得很重要了,这将在我们实际的开发过程中节省大量的下载时间。
二、分析
2.1 总体思路
由于python为开源语言,python的安装包一般就是源码的打包,因而下载的安装文件也就是python源码的压缩包,所以创建镜像的思路就是:自动的将软件库中各种包下载到本地,然后设置本地源为本地路径即可。
2.2 分析源的结构
anaconda源分为商业版和官方版两种,两种源如下:
图2、图3就是仓库的首页了,打开https://repo.anaconda.com/pkgs/main/linux-64/
可以看到linux-64平台下的所有的包:
从上面的分析可以看出,
社区版本的包网络路径为:
https://conda.anaconda.org/{channel}/{platform}/{file_name}
官方版本为:
https://repo.anaconda.org/{channel}/{platform}/{file_name}
这样就确定了包的下载路径了。
到这里,就确定了具体的镜像思路了:只需要抓取对应源下的平台下的所有包,即可完成镜像。
2.3 设置本地源
由包的链接可以得出抓取之后的路径为:
└── anaconda
├── cloud
│ └── conda-forge
│ ├── linux-64
│ └── noarch
└── pkgs
├── free
│ ├── linux-64
│ └── noarch
├── main
│ ├── linux-64
│ └── noarch
└── pro
├── linux-64
└── noarch
在抓取之后,需要将本地conda环境设置为本地源:
conda config --set channel_alias file://Path_to_your_channel/anaconda/pkgs
conda config --add channels free
conda config --add channels pro
conda config --add channels main
conda config --add channels conda-forge
conda config --remove channels defaults
conda config --set offline True
然后修改~/.condarc
:
channels:
- conda-forge
- main
- pro
- free
channel_alias: file://Path_to_your_channel/anaconda/pkgs
之后通过config –get命令查看具体的设置 :
conda config --get
--set channel_alias file://Path_to_your_channel/anaconda/pkgs
--add channels 'free' # lowest priority
--add channels 'pro'
--add channels 'main'
--add channels 'conda-forge' # highest priority
--set offline True
之后想要移除可以通过下面的命令来移除:
conda config --remove channels <your_mistake>
以上,即完成了对官方源和社区源的镜像。
2.4 部分改进
本项目参考了开源项目conda-mirror,并在之上进行了部分改进和优化:
1.添加下载进度条;
2.添加多线程下载;
3.添加main、free的channel支持;
4.取消缓存目录在部分操作删除已下载包
三、使用步骤
3.1 安装
git clone https://github.com/lixiang0/conda-mirror
cd conda-mirror
python setup.py install
3.2 使用示例
下载目录下创建conf.yaml,内容为:
blacklist:
- build: 'py2*'
whitelist:
- build: 'py3*'
释义:屏蔽python2的版本,只下载python3的版本包
执行命令:
conda-mirror --upstream-channel main --platform linux-64 -vvv --num-threads 12 --temp-directory ./temp/ -k --config conf.yaml
释义:
platform:下载对应平台下的包
vvv:显示warnning信息
num-threads下载和验证线程数目
temp-directory:缓存目录
k:不使用https
config:包过滤配置
运行截图:
更多的详细修改,可以参考github:https://github.com/lixiang0/conda-mirror
参考链接:
1.https://www.anaconda.com/products/individual
2.https://conda-forge.org/feedstocks/
3.https://repo.anaconda.com/pkgs/
4.https://dreambooker.site/2018/11/16/Set-up-personal-Anaconda-mirror/
5.https://pypi.org/project/conda-mirror/
6.https://docs.python.org/3/library/multiprocessing.html#multiprocessing.pool.Pool
7.https://github.com/Valassis-Digital-Media/conda-mirror
本文分为2部分:
随着工作年限的增长,工作和生活中积累的资源越来越多,尤其收藏的电影、数据集最为占硬盘。以物体跟踪数据集为例,整个TAO数据压缩包就有241.6GB。
以往的方式是挤牙膏式的趁着活动一块一块买,数据一点一点的腾挪。今年以来硬盘持续降价,以我关注的8T硬盘为例,从1200降到了1000。
所以才产生了将多块硬盘映射为一块的方法。这降省去了大量的硬盘管理和数据腾挪的时间。
首先是看看系统挂载了几块盘,执行命令sudo fdisk -l
,输出的信息节选如下:
Disk /dev/sdd: 7.3 TiB, 8001563222016 bytes, 15628053168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
接着是为新盘创建新分区。
假设/dev/sdd/
为新的硬盘,那么执行sudo fdisk /dev/sdd/
,可以看到输出:
Command (m for help):
这样就进入硬盘编辑模式了。
所以完成的操作就是(省去了d操作):
$ sudo fdisk /dev/sdd
Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition number (1-128, default 1): 1
First sector (34-468862094, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-468862094, default 468862094):
Created a new partition 1 of type 'Linux filesystem' and of size 223.6 GiB.
Command (m for help): t
Hex code (type L to list all codes): 30
Changed type of partition 'Linux filesystem' to 'Linux LVM'.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
接着安装LVM2和加载LVM2模块:
$ sudo apt-get install lvm2
Reading package lists... Done
Building dependency tree
Reading state information... Done
lvm2 is already the newest version (2.02.133-1ubuntu10).
lvm2 set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 38 not upgraded.
$ modprobe dm-mod
再执行sudo fdisk -l
,可以看到:
Disk /dev/sdd: 223.6 GiB, 240057409536 bytes, 468862128 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 571F1D75-FB94-4279-A090-0C96F9AA89B7
Device Start End Sectors Size Type
/dev/sdd1 2048 468862094 468860047 223.6G Linux LVM
出现了/dev/sdd1
的新分区。
以上完成了准备工作,下面就是创建lvm分区了:
$ sudo pvcreate /dev/sdd1
WARNING: vfat signature detected on /dev/sdd1 at offset 82. Wipe it? [y/n]: y
Wiping vfat signature on /dev/sdd1.
WARNING: vfat signature detected on /dev/sdd1 at offset 510. Wipe it? [y/n]: y
Wiping vfat signature on /dev/sdd1.
Physical volume "/dev/sdd1" successfully created
$ sudo vgcreate media /dev/sdd1
Volume group "media" successfully created
$ sudo lvcreate -l100%FREE -ndisks media
Logical volume "disks" created.
$ sudo mke2fs -t ext4 /dev/media/disks
mke2fs 1.42.13 (17-May-2015)
Discarding device blocks: done
Creating filesystem with 58606592 4k blocks and 14655488 inodes
Filesystem UUID: 6d2517f0-d5eb-4bf9-955c-cce175b03e9e
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
$ mkdir ~/disks
sudo mount /dev/media/disks ~/disks/
sudo umount /dev/media/disks #取消挂载
$ sudo vim /etc/fstab
#这一步是一劳永逸的方式,直接在系统进行<磁盘,目录>映射
/dev/media/disks ~/disks/ ext4 defaults 0 1
sudo vgextend media /dev/sdb1
将/dev/sdb1分配给media组。
sudo lvextend -L+150G /dev/media/disks
sudo resize2fs /dev/media/disks
额外分配150G给/dev/media/disks,并更新
sudo vgdisplay
显示当前的分区情况。比较重要的是:
Alloc PE / Size 431253 / 1.65 TiB
Free PE / Size 478 / 1.87 GiB
这里可以关注的是还有多少空余空间。
之前写过如何编写一个微博爬虫的文章,后来将微博爬虫开源到了GitHub上。 传统的视频图片的抓取姿势是如何的呢?如果使用requests包可以简单到下面这样的一句代码:
requests.get(img_url,stream=True).content
上述代码所完成的操作仅仅就是
为了突出重点,这里省略了代理、Header、以及超时的设置。但这样做不能分辨出假死的情况,尤其是微博这种视频图片居多的网站,很有可能卡在抓取视频图片的过程中不动。或者在下载大文件的时候,虽然文件一直在下载,但我们却不知道文件到底下载了多少,还有多少时间。
所以在爬虫开发过程中,如果能动态的展示视频或图片的下载过程对于监控爬虫运行时非常必要的。
图表 1 迅雷下载中的进度条
要做到为下载过程添加进度条,首先需要了解requests.get()方法和tqdm包。
tqdm来自阿拉伯文taqaddum ,意思是进度,也是西班牙语中的te quiero demasiado缩写,意思是我非常爱你。
conda install -c conda-forge tqdm
pip install tqdm
tqdm使用起来也非常方便,最简单的用法如下:
from tqdm import tqdm#导入相应的方法
for i in tqdm(range(10000)):#tqdm()方法
pass
只需要引入tqdm方法,然后使用将可迭代(iterable)的对象传入tqdm()方法即可。
复杂一点的用法如下:
with tqdm(total=100) as pbar:#tqdm方法设置进度条长度
for i in range(10):
sleep(0.1)
pbar.update(10)#手动更新进度
本文获取文件长度通过requests.get()方法。Requests.get()方法当stream=True的时候,get()方法只下载Header部分,如果要下载Body部分,需要读取content属性才会下载。所以我们可以利用这一点来完成对视频图片的下载监控。获取文件大小的方法如下:
response=requests.get(img_url,stream=True)
file_size=response.headers['Content-length']
Iter_content方法用于分块读取get()方法返回的流,避免因一次性读取消耗大量内存。
完整的代码如下:
import requests
import tqdm
img_url='http://122.51.50.206:8088/imgs/63943f53ly1gjgojmh9zaj222o0yi7wq.jpg'
response=requests.get(img_url,stream=True)
file_size=response.headers['Content-length']
print(file_size)
pbar=tqdm.tqdm(total=int(file_size),unit='B',unit_scale=True,desc=img_url.split('/')[-1])
with(open('1.jpg','wb')) as f:
for chunk in response.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
pbar.update(1024)
pbar.close()
步骤如下: (1) 获取Header (2) 读取Header中的Content-length字段得到文件大小 (3) 初始化tqdm (4) 分块读取文件并更新进度条 (5) 关闭进度条
最后,欢迎持续关注。