PyTorch是一个广泛使用的开源深度学习平台,用于轻松地用Python编写神经网络层,从而实现从研究到生产的无缝工作流程。 基于Torch,PyTorch已成为强大的机器学习框架,受到世界各地著名研究人员的青睐。
PyTorch的最新稳定版本1.6.0版具有许多新功能,包括自动混合精度(AMP)。 Beta版的新功能包括用于RPC的TensorPipe后端,内存探查器,以及针对RPC和DDP的分布式训练的多项改进。
PyTorch 1.6版本包括许多新的API,用于性能改进和性能分析的工具,以及对基于分布式数据并行(DDP)和基于远程过程调用(RPC)的分布式训练的重大更新。
一些亮点包括:
此外,从此版本开始,功能将分为稳定,Beta和原型。原型功能不包含在二进制发行版中,而是可以通过使用Nightly从源代码构建或通过编译器标志来使用。您可以在此处的帖子中了解有关此更改含义的更多信息。
AMP使用户可以轻松启用自动混合精度训练,从而在Tensor Core GPU上实现更高的性能并节省多达50%的内存。 AMP使用本机支持的torch.cuda.amp API,为混合精度提供了便捷的方法,其中某些操作使用torch.float32(float)数据类型,而其他操作使用torch.float16(half)。 一些操作,例如线性图层和卷积,在float16中要快得多。 其他操作(如减少操作)通常需要float32的动态范围。 混合精度会尝试将每个运算符匹配到其适当的数据类型。
PyTorch 1.6为RPC模块引入了一个新的后端,该模块利用TensorPipe库,TensorPipe库是面向机器学习的张量感知点对点通信原语,旨在补充PyTorch中用于分布式训练的当前原语(Gloo,MPI等)。 这是集体和阻碍的。 TensorPipe的成对和异步特性使其适用于超越数据并行的新网络范例:客户端-服务器方法(例如,用于嵌入的参数服务器,Impala式RL中的actor-learner分离等)以及模型和管道并行训练( (GPipe),八卦SGD等
#仅需一行更改即可选择
intorch.distributed.rpc.init_rpc(…backend = torch.distributed.rpc.BackendType.TENSORPIPE,)#其余RPC API无需更改torch.distributed.rpc.rpc_sync(…)
现在,torch.autograd.profiler API包括一个内存分析器,可让您检查CPU和GPU模型中不同运算符的张量内存成本。
这是API的示例用法:
导入torch导入torchvision.models作为模型导入torch.autograd.profiler作为探查器model = models.resnet18()inputs = torch.randn(5,3,224,224)与profiler.profile(profile_memory = True,record_shapes = True)作为教授:model(inputs)#注意:为简便起见,删除了一些列(prof.key_averages()。table(sort_by =” self_cpu_memory_usage”,row_limit = 10))#————————— ————— ————————————#名称CPU内存自身CPU内存呼叫数量#————————— —————— —————— ————#空94.79 Mb 94.79 Mb 123#resize_ 11.48 Mb 11.48 Mb 2#addmm 19.53 Kb 19.53 Kb 1#empty_strided 4 b 4 b 1#conv2d 47.37 Mb 0 b 20#————————————————————— ————
[测试版] DDP + RPC
PyTorch Distributed支持两种强大的范例:用于模型的完全同步数据并行训练的DDP和允许分布式模型并行的RPC框架。目前,这两个功能是独立运行的,用户无法混合使用这些功能来尝试混合并行性范例。
从PyTorch 1.6开始,我们已使DDP和RPC无缝协作,以便用户可以结合使用这两种技术来实现数据并行性和模型并行性。一个示例是用户希望将大型嵌入表放置在参数服务器上,并使用RPC框架嵌入查找,但希望将较小的密集参数存储在训练器上,并使用DDP来同步密集参数。以下是一个简单的代码段。
//在每个训练器上,remote_emb = create_emb(on =“ ps”,…)ddp_model = DDP(dense_model)批量处理的数据:
torch.distributed.autograd.context():res = remote_emb(data)损失= ddp_model(res )torch.distributed.autograd.backward([loss])
[Beta] RPC –异步用户功能
RPC异步用户功能支持在执行用户定义的功能时在服务器端产生和恢复的功能。在使用此功能之前,当被调用方处理请求时,一个RPC线程将等待,直到用户函数返回。如果用户功能包含IO(例如,嵌套的RPC)或信令(例如,等待另一个请求解除阻止),则相应的RPC线程将处于空闲状态,等待这些事件。结果,某些应用程序必须使用大量线程并发送其他RPC请求,这有可能导致性能下降。为了使用户函数在此类事件上屈服,应用程序需要:1)使用@
rpc.functions.async_execution装饰器装饰函数;和2)让函数返回torch.futures.Future并将resume逻辑作为回调安装在Future对象上。参见以下示例:
@
rpc.functions.async_executiondef async_add_chained(to,x,y,z):返回rpc.rpc_async(to,torch.add,args = {x,y))。then(lambda fut:fut.wait()+ z) ret = rpc.rpc_sync(“ worker1”,async_add_chained,args =(“ worker2”,torch.ones(2),1,1))print(ret)#打印张量([3.,3.])
[测试版]前叉/合并并行
此版本增加了对语言级别构造的支持,以及对TorchScript代码中的粗粒度并行性的运行时支持。 该支持对于诸如在整体中并行运行模型或并行运行循环网络的双向组件之类的情况非常有用,并允许为任务级并行性解锁并行架构(例如多核CPU)的计算能力的能力。
通过两个原语启用TorchScript程序的并行执行:torch.jit.fork和torch.jit.wait。 在下面的示例中,我们并行执行foo:
从键入import list def foo(x)导入torch:返回torch.neg(x)@ torch.jit.scriptdef示例(x):futures = [torch.jit.fork(foo,x)for _ in range(100)] 结果= [用于将来期货的torch.jit.wait(未来)]返回torch.sum(torch.stack(结果))print(example(torch.ones([])))