计图(Jittor) 1.1版本:新增骨干网络、JIT功能升级、支持多卡训练
计图(Jittor) 1.1版本:新增骨干网络、JIT功能升级、支持多卡训练
深度学习框架—计图(Jittor),Jittor的新版本V1.1上线了。主要变化包括:
- 增加了大量骨干网络的支持,增强了辅助转换脚本的能力,降低用户开发和移植模型的难度。
- JIT(动态编译)功能升级,可支持高性能的自定义算子开发,并降低了用户开发自定义算子的难度。
- 新增分布式功能,用户无需修改代码,只需要修改启动命令,单卡版本的训练程序可以直接无缝部署到多卡甚至多机上。
此外,Jittor还新增支持了大量神经网络算子,完善了对深度神经网络开发的支持。
新增骨干网络
Jittor 1.1版本在模型库中新增了大量基础骨干网络,用户可以基于这些基础骨干网络搭建自己的深度学习模型。这些骨干网络参数与PyTorch参数格式兼容,可以相互加载调用,方便用户学习和迁移。
更新的骨干网络包括:
import jittor.models
from jittor.models import \
alexnet, \
googlenet, \
inception_v3, \
mnasnet, \
mobilenet_v2, \
resnext101_32x8d, \
shufflenetv2, \
squeezenet, \
wide_resnet101_2
# 更多主干网络支持请参考
print(dir(jittor.models))
下面是对AlexNet、VGG、ResNet、Wide ResNet和SqueezeNet等多种骨干网络,在不同的batch size下,Jittor与PyTorch的单次前向性能对比,图1中横轴为不同Batch size,纵轴为FPS(每秒处理的图像数)。实验环境为:GPU为1080ti,显存11GB,CPU为i7-6850K,内存32GB,使用32位浮点数计算。
可以看出Jittor在这些常用骨干网络上的速度非常可观,大多数网络Jittor会有速度的提升。
增强辅助转换脚本
此次更新还提供了简单的辅助转换脚本,支持从PyTorch转换模型代码,暂不支持模型以外代码,下面是一个简单的实例:
from jittor.utils.pytorch_converter import convert
pytorch_code = """
class Model(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 10, 3)
self.conv2 = nn.Conv2d(10, 32, 3)
self.fc = nn.Linear(1200, 100)
def forward(self, x):
x = self.conv1(x)
x = self.conv2(x)
x = x.view(x.size(0), -1)
x = self.fc(x)
return x
"""
jittor_code = convert(pytorch_code)
print("## Generate Jittor code:", jittor_code)
exec(jittor_code)
model = Model()
print("## Jittor model:", model)
上面的脚本将输出计图模型代码,以及一个可用的模型:
## 生成的计图代码:
import jittor as jt
from jittor import init
from jittor import nn
class Model(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv(1, 10, 3)
self.conv2 = nn.Conv(10, 32, 3)
self.fc = nn.Linear(1200, 100)
def execute(self, x):
x = self.conv1(x)
x = self.conv2(x)
x = x.view((x.shape[0], (- 1)))
x = self.fc(x)
return x
## 计图模型:
Model(
conv1: Conv(1, 10, (3, 3), (1, 1), (0, 0), (1, 1), groups=1, bias=float[10,])
conv2: Conv(10, 32, (3, 3), (1, 1), (0, 0), (1, 1), groups=1, bias=float[32,])
fc: Linear(1200, 100, float32[100,], None)
)
关于模型转换脚本的详细使用请参考计图官方文档。
JIT功能升级
Jittor 1.1版本的 JIT(动态编译)功能的增强,主要体现在code算子的功能增强上。Code算子是一个基于高性能语言的动态编译算子,允许用户直接在Python中内联C++/CUDA代码,只需要寥寥数行代码,就可以完成高性能的自定义算子开发,降低用户开发自定义算子的难度。
下面的实例展示了如何使用code算子,使用数行代码实现三维点云中十分常用的K近邻查找。Code算子的设计和实现,让用户既可以享受到Python语言的便捷与易用性,又可以获得高性能语言的性能。
a = jt.random((n,3))
b = jt.code([n, k], "int32", [a],
cpu_header="#include <algorithm>",
cpu_src="""
using namespace std;
auto n=out_shape0, k=out_shape1;
// 使用openmp实现自动并行化
#pragma omp parallel for
for (int i=0; i<n; i++) {
// 存储k近邻的距离和下标
vector<pair<float,int>> id(n);
for (int j=0; j<n; j++) {
auto dx = @in0(i,0)-@in0(j,0);
auto dy = @in0(i,1)-@in0(j,1);
auto dz = @in0(i,2)-@in0(j,2);
id[j] = {dx*dx+dy*dy+dz*dz, j};
}
// 使用c++算法库的nth_element排序
nth_element(id.begin(),
id.begin()+k, id.end());
// 将下标输出到计图的变量中
for (int j=0; j<k; j++)
@out(i,j) = id[j].second;
}"""
)
将计图使用code算子实现的K近邻查找,和PyTorch的算子用时进行比较,速度对比如下(k=10,点云数量n=[100,1000,10000]):
参数 |
n=100 |
n=1000 |
n=10000 |
PyTorch |
433 µs |
7.6 ms |
623 ms |
Jittor |
68 µs |
5.9 ms |
484 ms |
速度对比 |
6.4X |
1.29X |
1.29X |
注:此处使用的K近邻算法为暴力算法,还存在更优的算法实现,由于文章篇幅有限,此处仅用于展示Code算子的使用。
更新大幅度提升了code算子的易用性和可读性,主要包含以下几点:
- code 算子 可以有多个输出
- code 算子 允许输出动态大小的变量
- code 算子 内部可以写注释
- code 算子 可以通过@alias为input和outputs增加别名,增加代码可读性
具体文档请参考help(jt.code)和提供的文档,计图提供了多种实例以供参考。目前内联C++代码支持CUDA和openmp,未来会加入更多语言和库的支持。
分布式接口
计图本次分布式更新主要基于MPI(Message Passing Interface),依赖OpenMPI,用户可以使用如下命令安装OpenMPI:
sudo apt install openmpi-bin openmpi-common libopenmpi-dev
OpenMPI安装完成以后,用户无需修改代码,需要做的仅仅是修改启动命令行,计图就会用数据并行的方式自动完成并行操作。
# 单卡训练代码
python3.7 -m jittor.test.test_resnet
# 分布式多卡训练代码
mpirun -np 4 python3.7 -m jittor.test.test_resnet
# 指定特定显卡的多卡训练代码
CUDA_VISIBLE_DEVICES="2,3" mpirun -np 2 python3.7 -m jittor.test.test_resnet
这种便捷性的背后是计图的分布式算子的支撑,计图支持的mpi算子后端会使用nccl进行进一步的加速。计图所有分布式算法的开发均在Python前端完成,这让分布式算法的灵活度增强,开发分布式算法的难度也大大降低。下面的代码是使用计图实现分布式同步批归一化层的实例代码:
def execute(self, x):
if self.is_train:
xmean = jt.mean(x, dims=[0,2,3], keepdims=1)
x2mean = jt.mean(x*x, dims=[0,2,3], keepdims=1)
if self.sync and jt.mpi:
xmean = xmean.mpi_all_reduce("mean")
x2mean = x2mean.mpi_all_reduce("mean")
xvar = x2mean-xmean*xmean
norm_x = (x-xmean)/jt.sqrt(xvar+self.eps)
self.running_mean += (xmean.sum([0,2,3])-self.running_mean)*self.momentum
self.running_var += (xvar.sum([0,2,3])-self.running_var)*self.momentum
else:
running_mean = self.running_mean.broadcast(x, [0,2,3])
running_var = self.running_var.broadcast(x, [0,2,3])
norm_x = (x-running_mean)/jt.sqrt(running_var+self.eps)
w = self.weight.broadcast(x, [0,2,3])
b = self.bias.broadcast(x, [0,2,3])
return norm_x * w + b
这次更新,开放了mpi算子的稳定接口,用户可以自行使用mpi算子开发所需的自定义的分布式算法,相关文档请参考help(jittor.mpi.ops)和计图分布式教程。基于这些mpi算子接口,研发团队已经集成了如下三种分布式相关的算法:
- 分布式数据并行加载
- 分布式优化器
- 分布式同步批归一化层
其他更新
教程更新列表:
算子更新列表:
- group conv
- 三角函数,反三角函数,双曲函数,反双曲函数支持
- flatten
- view
- permute
- adapool
- PReLU
- LeakyReLU
- ReLU6
- ReflectionPad2d
- ZeroPad2d
- ConstantPad2d
- ReplicationPad2d
- PixelShuffle
- Upsample
损失函数更新列表:
- MSELoss
- BCELoss
- L1Loss
- BCEWithLogitsLoss
分布式相关算子:
- mpi_all_reduce
- mpi_reduce
- mpi_broadcast
- nccl_all_reduce
- nccl_reduce
- nccl_broadcast
计图(Jittor) 1.1版本:新增骨干网络、JIT功能升级、支持多卡训练的更多相关文章
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增岗位管理-WinForm部分
RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本 新增岗位管理-WinForm部分 岗位(职位)管理模块主要是针对组织机构的岗位(职位)进行管理,包括:增加.修改. ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->WinForm版本新增新的角色授权管理界面效率更高、更规范
角色授权管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能) ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->Web版本新增新的角色授权管理界面效率更高、更规范
角色授权管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能) ...
- openlayers-统计图显示(中国区域高亮)
openlayers版本: v3.19.1-dist 统计图效果: 案例下载地址:https://gitee.com/kawhileonardfans/openlayers-examp ...
- 计图MPI分布式多卡
计图MPI分布式多卡 计图分布式基于MPI(Message Passing Interface),主要阐述使用计图MPI,进行多卡和分布式训练.目前计图分布式处于测试阶段. 计图MPI安装 计图依赖O ...
- RDIFramework.NET V2.9版本 WinFom部分新增与修正的功能
RDIFramework.NET V2.9版本 WinFom部分新增与修正的功能 转眼间RDIFramework.NET框架走了快6个年头了,随着一个版本一个版本的升级改造,现在已经越来越完美了.使 ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增企业通(内部简易聊天工具)
RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本 新增企业通(内部简易聊天工具) RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用 ...
- Python-爬取妹子图(单线程和多线程版本)
一.参考文章 Python爬虫之——爬取妹子图片 上述文章中的代码讲述的非常清楚,我的基本能思路也是这样,本篇文章中的代码仅仅做了一些异常处理和一些日志显示优化工作,写此文章主要是当做笔记,方便以后查 ...
- .NET快速信息化系统开发框架 V3.2->Web版本新增“文件管理中心”集上传、下载、文件共享等一身,非常实用的功能
文件中心是3.2版本开始新增的一个非常实用功能,可以归档自己平时所需要的文件,也可以把文件分享给别人,更像一个知识中心.文件中心主界面如下图所示,左侧“我的网盘”展示了用户对文件的分类,只能自己看到, ...
随机推荐
- 02- web UI测试与UI Check List
UI英文是 user interface .所以UI测试就是用户界面测试. Web UI测试 用户界面测试:user interface testing,UI Testing指软件中的可见外观及其与用 ...
- POJ 2752 同一个串的前后串
题解东北赛回来再补 #include<stdio.h> #include<string.h> int next[500000]; int ans[500000]; char s ...
- Android平台dalvik模式下java Hook框架ddi的分析(1)
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/75710411 一.前 言 在前面的博客中已经学习了作者crmulliner编写的, ...
- DVWA之 SQL Injection(Blind)
SQL Injection(Blind) SQL Injection(Blind),即SQL盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法 ...
- Win64 驱动内核编程-5.内核里操作文件
内核里操作文件 RING0 操作文件和 RING3 操作文件在流程上没什么大的区别,也是"获得文件句柄->读/写/删/改->关闭文件句柄"的模式.当然了,只能用内核 A ...
- 【js】Leetcode每日一题-完成所有工作的最短时间
[js]Leetcode每日一题-完成所有工作的最短时间 [题目描述] 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工 ...
- java面试一日一题:java中垃圾回收算法有哪些
问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...
- 操作系统中的进程同步与Window中利用内核对象进行线程同步的关系
操作系统中为了解决进程间同步问题提出了用信号量机制,信号量可分为四种类型分别是互斥型信号量,记录型信号量,AND型信号量,信号量集. 互斥型信号量 互斥型信号量是资源数量为1的特殊的记录型信号量.表示 ...
- Redis内存——内存消耗(内存都去哪了?)
最新:Redis内存--三个重要的缓冲区 最新:Redis内存--内存消耗(内存都去哪了?) 最新:Redis持久化--如何选择合适的持久化方式 最新:Redis持久化--AOF日志 更多文章... ...
- Solon Aop 特色开发(1)注入或手动获取配置
常规操作,先启动 Solon public class App{ public void main(String[] args){ Solon.start(App.class, args); } } ...