0404-Tensor的持久化和向量化

0404-Tensor的持久化和向量化作

pytorch完整教程目录:https://www.cnblogs.com/nickchen121/p/14662511.html

一、持久化

和sklearn中的持久化一样,保存一个模型或者特有的数据为pkl数据。但是tensor在加载数据的时候还可以把gpu tensor映射到cpu上或者其他gpu上。

1.1 保存模型

if t.cuda.is_available():
    a = a.cuda(1)  # 把a转为gpu1上的tensor
    t.save(a, 'a.pkl')

1.2 加载模型

# 加载为b,存储于gpu1上(因为保存时tensor就在gpu1上)
b = t.load('a.pkl')
# 加载为c,存储于cpu
c = t.load('a.pkl', map_location=lambda storage, loc: storage)
# 加载为d,存储于gpu0上
d = t.load('a.pkl', map_location={'cuda:1': 'cuda:0'})

二、向量化

向量化计算是一种特殊的并行计算方法,通常是对不同的数据执行同样的一个或一批指令。由于Python原生的for循环效率低下,因此可以尽可能的使用向量化的数值计算。

def for_loop_add(x, y):
    result = []
    for i, j in zip(x, y):
        result.append(i + j)
    return t.Tensor(result)


x = t.zeros(100)
y = t.ones(100)

%timeit -n 100 for_loop_add(x,y)
%timeit -n 100 x+y
566 µs ± 100 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
3.25 µs ± 1.63 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

从上面可以看见,如果自己写一个方法实现内建函数,运行时间相差200倍,因为内建函数底层大多由c/c++实现,能通过执行底层优化实现高效计算。所以平时在写代码时,应该养成向量化的思维习惯。

三、注意事项

除了上述讲的大多数内容,最后还有以下三点需要注意:

  1. 大多数t.function都有一个参数out,可以将其产生的结果保存在out指定的tensor之中
  2. t.set_num_threads可以设置torch进行cpu多线程并行计算时所占用的线程数,用来限制torch所占用的cpu数目
  3. t.set_printoptions可以用来设置打印tensor时的数值精度和格式
b = t.FloatTensor()
t.randn(2, 3, out=b)
b
tensor([[ 1.4754, -0.7392, -0.1900],
        [-0.8091,  0.2227,  0.8951]])
t.set_printoptions(precision=10)
b
tensor([[ 1.4753551483, -0.7392477989, -0.1899909824],
        [-0.8091416359,  0.2227495164,  0.8951155543]])

四、第四章总结

这一章幅度较大,对于熟悉numpy的同学可能得心应手很多,如果对numpy不是特别熟悉的同学,建议先按照上述所给的教程学一遍numpy,再过来学习tensor这个数据类型,从一二维过渡到高维,也将更容易上手。

这篇文章内容虽多,但从实用的角度来说,相对而言也比较全面,其中内容不需要全部熟稔于心,但至少得对每个方法都大概有个印象,知道有这个东西,这个东西能干啥!

posted @ 2021-04-24 17:41  B站-水论文的程序猿  阅读(945)  评论(0编辑  收藏  举报