AI Studio[1] 可以用 GPU,探索下装 gpu 版 tensorflow 和 pytorch。 好像已经不行了,见其 2020-05-15 号 AI Studio临时升级公告。

Environment

系统:Ubuntu 16.04(uname -a、cat /etc/issue); 开 gpu 环境,可调nvidia-smi。driver version:396.37;在 /usr/local 可见 cuda-9.2/;显存:16160MiB。

Persistent Directory

有 3 个持久化目录可以放自己东西:

  • ~,即 /home/aistudio/;
  • ~/work/,放代码,有 100G 空间[2];
  • ~/external-libraries/,这个要自己 mkdir,放自己装的软件;

没用的东西可以弃掉,开环境会自动同步文件,耗时,有时不成功要重试几次。

Independent Projects’ Spaces

好像…每个项目都是独立的空间,新开一个项目发现之前配的环境全都没了。 而且原来它本来就有 conda,不过应该不在持久化目录,还是自己装个 miniconda 吧。

Miniconda

页面上的 上传文件 不能超过 30M,要用 wget 下。Anaconda 太大了,换成 Miniconda[7],装在 external-libraries/ 下。推荐:下载好 Anaconda/Miniconda,放在一个自己创建的数据集中,开新项目的时候挂载这个数据集,就不用每次都下载一次了。见 Custom Data。 装的时候会改 .bashrc 文件,要备份!因为每次启动环境 .bashrc 就会重置,要用这个备份的 .bashrc 替换 ~ 下的 .bashrc,并 source .bashrc 一次。 换 conda 源成清华源[8],自建 .condarc,也要备份,因为重开环境会消失。

cuda

曾经以为要自己装 cuda、cudnn 这些,其实不用,CUDA_HOME 不用设,$LD_LIBRARY_PATH 也不用改。所以参考 [9-11, 13] 可以忽略。

GPU Test

我开了虚拟环境 dl:conda create -n dl python=3.6,在里面装 tensorflow 和 pytorch,选版本的时候可以参考 [12] 和 pytorch 官网给出的安装命令。 [2] 说自己装了其它库在 external-libraries/ 的话,要在代码前面加两句:

import sys
sys.path.append('/home/aistudio/external-libraries')

而我在虚拟环境里运行的时候,发现好像并不需要。

TensorFlow

安装:conda install -n dl tensorflow-gpu==1.12.0

testing code

#import sys
#sys.path.append("/home/aistudio/external-libraries")
import tensorflow as tf
from tensorflow.python.client import device_lib

print(tf.__version__)

print("\ngpu availiable:\n", tf.test.is_gpu_available())
local_devices = device_lib.list_local_devices()

# 打印所有设备名
print("\nlocal devices:")
print("#devices:", len(local_devices))
for dev in local_devices:
    print(dev)

# 打印 gpu 名字
print("\ngpu name:\n", tf.test.gpu_device_name())

x = tf.constant([[1, 2, 3]], dtype="float32")
w = tf.constant([
    [1, 2, 3], [4 ,5, 6], [7, 8, 9]], dtype="float32")
for i in range(10):
    x = tf.matmul(x, w)
out = x

with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
    print("out:", sess.run(out))

其中,tf.ConfigProto(log_device_placement=True) 可以打印出每个 tensor 放在哪里设备,可以检测它是不是放在 gpu 上。 我还另开一个终端,一边执行,一边在另一个终端多次执行 nvidia-smi,发现 gpu 有显存占用,应该是成功了吧?

Pytorch

安装:conda install pytorch torchvision cudatoolkit=9.2 -c pytorch

testing code

import torch
flag = torch.cuda.is_available()
print(flag)

ngpu= 1
# Decide which device we want to run on
device = torch.device("cuda:0" if (torch.cuda.is_available() and ngpu > 0) else "cpu")
print(device)
print(torch.cuda.get_device_name(0))
print(torch.rand(3,3).cuda()

如法测试,也可以。

Custom Data

自己的数据集可以创建数据集,然后挂到项目下[2]。单个文件限 10G。

aistudio配置tensorflow aistudio不能用pytorch了_AIStudio

另外,项目里上传文件有 30M 大小限制,估计只是用来传代码的,太大的文件也可以通过创建数据集的方式进行。上传的文件需要保存就放到持久化目录。

Codes Updating

代码更新比较麻烦,不能在线编辑。 可以在 Gitee 开 repo 做中转站,本地写好 push 上去,再在 AI Studio 的项目里那 clone 和 pull,虽然有点曲折… 需要用到 ssh 免密登录,参考 [16]。记得备份生成在 ~/.ssh/ 下的 id_rsa 和 id_rsa.pub 两个文件,因为重开项目又会消失,这样就可以重用在 gitee 添加的 SSH key。这两个文件的权限要设成 400,否则报错,参考 [17]。

branchs

如果 git 里开了分支,比如 dev 分支,push 的时候可以:git push origin dev:dev,或者如果本地 git 本身就在 dev 下,可以简写:git push origin dev; pull 的时候:git pull origin dev:dev,或者 ai studio 的 git 本身就在 dev 下,可以简写:git pull origin dev。参考 [19]。 clone 某个分支,用--branch参数:git clone--branch <BRANCH_NAME><REPO>

multiple remote repositories

远程仓库的别名一般叫 origin,但关联多个远程仓库(如 github 和 gitee)时,可以改易于分辨的别名。 例如一个仓库同时关联 github 和 gitee 的一个仓库,分别取别名 github 和 gitee:

  • git remote addgithubgit@github.com:某
  • git remote addgiteegit@gitee.com:某。

push/pull 的时候分别名操作:

  • git pullgithubmaster:master
  • git pushgiteedev:dev

clone

clone 时取别名用-o:git clone-o <ALIAS><REPO>。 如果有多个分支,如 dev,则 clone 之后用 git checkout -b dev origin/dev 拉下来,同时绑定了本地 dev 和 远程 origin/dev 的 track 关系,可以直接用 git push/pull 而不用加参数[20]。(我之前直接用git pull gitee dev:dev 会出现奇怪的事情,就是拉下来的 dev 中的内容会影响到 master 的内容,然后…一顿莫名其妙)

Auxiliary Scripts

将初始化环境的命令写入 shell 文件,方便执行:

#!/bin/bash
# init.sh

echo "init env..."
cd

# .bashrc
rm .bashrc
cp work/bashrc.bak .bashrc
source .bashrc  # 这句好像没有效果?

# .condarc
cp work/condarc.bak .condarc

# .ssh
mkdir .ssh
cp work/id_rsa .ssh
cp work/id_rsa.pub .ssh

echo "finish"

要执行 source 那行需要用 bash(ubuntu 默认 sh 是 dash),见 [18],但似乎不见效果?手动 source 一次。