机器/深度学习FastPhotoStyle、ScalaNLP、Tensor Comprehensions介绍

以下为你介绍的机器学习/深度学习软件都可用在Linux系统上:FastPhotoStyle(图片风格转移深度学习算法实现)、ScalaNLP(机器学习和数学计算库)、Tensor Comprehensions(将数学符号快速转换为高性能机器学习代码)。

1、FastPhotoStyle(图片风格转移深度学习算法实现)

机器/深度学习FastPhotoStyle、ScalaNLP、Tensor Comprehensions介绍

FastPhotoStyle 是英伟达开源的照片风格转移深度学习算法实现库,给定目标照片和样式参考照片,代码可以将样式照片的风格转换至目标照片,从而生成新的风格化照片。

FastPhotoStyle 实现过程包含两个步骤:“风格化”和“细调”。先将样式参考照片源的样式转移至目标照片,随后对其进行细调优化。

下载地址:https://github.com/NVIDIA/FastPhotoStyle

2、ScalaNLP(机器学习和数学计算库)

ScalaNLP 是一组 Scala 的机器学习和数学计算库。包含了很多库的封装。

示例代码:

scala> x(0)

Double = 0.0

scala> x(1) = 2

scala> x

breeze.linalg.DenseVector[Double] = DenseVector(0.0, 2.0, 0.0, 0.0, 0.0)

下载地址:https://gitee.com/mirrors/ScalaNLP

3、Tensor Comprehensions(将数学符号快速转换为高性能机器学习代码)

机器/深度学习FastPhotoStyle、ScalaNLP、Tensor Comprehensions介绍

Tensor Comprehensions 是 Facebook AI  研究院开源的  C++  库及数学语言,功能齐全,能有效填补研究人员于数学运算领域的沟通鸿沟,并基于各种硬件后端上大规模运行工程模型。

Tensor Comprehensions 采用了 Just-In-Time 的编译自动生成机器学习社区所需的高性能代码,并被设计为高度可移植的。通过 Tensor Comprehensions,研究人员能够以数学符号的方式进行编写,系统能够根据需求进行编译调整,并输出专业的代码。

一个简单的例子:

以下内容说明了该库的一个简短而强大的功能:针对特定大小,可以按需JIT编译高性能机器学习内核的能力。

import tensor_comprehensions as tc

import torch

lang = """

def tensordot(float(N, C1, C2, H, W) I0, float(N, C2, C3, H, W) I1) -> (O) {

O(n, c1, c3, h, w) +=! I0(n, c1, c2, h, w) * I1(n, c2, c3, h, w)

}

"""

N, C1, C2, C3, H, W = 32, 512, 8, 2, 28, 28

tensordot = tc.define(lang, name="tensordot")

I0, I1 = torch.randn(N, C1, C2, H, W).cuda(), torch.randn(N, C2, C3, H, W).cuda()

best_options = tensordot.autotune(I0, I1, cache=True)

out = tensordot(I0, I1, options=best_options)

在2-GPU P100系统上进行几代自动调整后,我们看到的结果类似于:

机器/深度学习FastPhotoStyle、ScalaNLP、Tensor Comprehensions介绍

在C++中,最小的自动调整示例类似于以下内容:

TEST(TensorDot, SimpleAutotune) {

// 1. Define and setup the TC compilation unit with CUDA memory

// management backed by ATen tensors.

std::string tc = R"TC(

def tensordot(float(N, C1, C2, H, W) I0,

float(N, C2, C3, H, W) I1)  -> (O)

{

O(n, c1, c3, h, w) +=! I0(n, c1, r_c2, h, w) * I1(n, r_c2, c3, h, w)

}

)TC";

// 2. Allocate tensors with random data.

at::Tensor I0 = at::CUDA(at::kFloat).rand({32,  8, 16, 17, 25});

at::Tensor I1 = at::CUDA(at::kFloat).rand({32, 16, 2, 17, 25});

// 3. Run autotuning with evolutionary search starting from a naive option.

auto naiveOptions = Backend::MappingOptionsType::makeNaiveMappingOptions();

tc::aten::ATenAutotuner<tc::CudaBackend, tc::autotune::GeneticSearch>

geneticAutotuneATen(tc);

auto bestOption =

geneticAutotuneATen.tune("tensordot", {I0, I1}, {naiveOptions});

// 4. Compile and run the TC with the best option after allocating output

//    tensors.

auto pExecutor =

tc::aten::compile<Backend>(tc, "tensordot", {I0, I1}, bestOption[0]);

auto outputs = tc::aten::prepareOutputs(tc, "tensordot", {I0, I1});

auto timings = tc::aten::profile(*pExecutor, {I0, I1}, outputs);

std::cout << "tensordot size I0: " << I0.sizes() << ", "

 << "size I1: " << I1.sizes()

 << " ran in: " << timings.kernelRuntime.toMicroSeconds() << "us\n";

}

请注意,我们只需对TC进行一次自动调谐即可获得合理的映射选项,这些选项可以转换为给定TC的其他问题大小,如以下代码段所示:

// 5. Reuse bestOptions from autotuning on another kernel

for (auto sizes : std::vector<std::pair<at::IntList, at::IntList>>{

{{4, 9, 7, 16, 14}, {4, 7, 3, 16, 14}},

{{8, 5, 11, 10, 10}, {8, 11, 16, 10, 10}},

}) {

at::Tensor I0 = makeATenTensor<Backend>(sizes.first);

at::Tensor I1 = makeATenTensor<Backend>(sizes.second);

auto pExecutor =

tc::aten::compile<Backend>(tc, "tensordot", {I0, I1}, bestOption[0]);

auto outputs = tc::aten::prepareOutputs(tc, "tensordot", {I0, I1});

auto timings = tc::aten::profile(*pExecutor, {I0, I1}, outputs);

std::cout << "tensordot size I0: " << I0.sizes() << ", "

 << "size I1: " << I1.sizes()

 << " ran in: " << timings.kernelRuntime.toMicroSeconds()

 << "us\n";

}

放在一起,可能会看到:

> build$ ./examples/example_simple

[==========] Running 1 test from 1 test case.

[----------] Global test environment set-up.

[----------] 1 test from TensorDot

[ RUN      ] TensorDot.SimpleAutotune

Generation 0    Jobs(Compiled, GPU)/total  (10, 10)/10   (best/median/worst)us: 226/4238/7345

Generation 1    Jobs(Compiled, GPU)/total  (10, 10)/10   (best/median/worst)us: 220/221/233

Generation 2    Jobs(Compiled, GPU)/total  (10, 10)/10   (best/median/worst)us: 220/221/234

tensordot size I0: [16, 8, 16, 17, 25], size I1: [16, 16, 2, 17, 25] ran in: 239us

tensordot size I0: [4, 9, 7, 16, 14], size I1: [4, 7, 3, 16, 14] ran in: 56us

tensordot size I0: [8, 5, 11, 10, 10], size I1: [8, 11, 16, 10, 10] ran in: 210us

[       OK ] TensorDot.SimpleAutotune (27812 ms)

[----------] 1 test from TensorDot (27812 ms total)

[----------] Global test environment tear-down

[==========] 1 test from 1 test case ran. (27812 ms total)

[  PASSED  ] 1 test.

我们尚未确定获得的峰值性能的精确比例,但是在自动调整后获得峰值共享内存带宽的80%以上并不罕见。可靠的寄存器级优化仍在进行中,但是目前形式的TC已经解决了研究需求和生产需求之间的生产力差距,这就是为什么我们很高兴与整个社区共享它,并将这种协作成果公开进行的原因。

下载地址:https://github.com/facebookresearch/TensorComprehensions/

注明

以上就是机器/深度学习FastPhotoStyle、ScalaNLP、Tensor Comprehensions的介绍内容,这些机器学习/深度学习软件都能使用在Linux操作系统中。

栏目相关文章