精华内容
下载资源
问答
  • C++加载PYTORCH模型PyTorch的主要接口为Python。虽然Python有动态编程和易于迭代的优势,但很多情况下,正是Python的这些属性会带来不利。我们经常遇到的生产环境,要满足低延迟和严格部署要求。对于生产场景...

    在C++中加载PYTORCH模型

    PyTorch的主要接口为Python。虽然Python有动态编程和易于迭代的优势,但在很多情况下,正是Python的这些属性会带来不利。我们经常遇到的生产环境,要满足低延迟和严格部署要求。对于生产场景而言,C++通常是首选语言,也能很方便的将其绑定到另一种语言,如Java,Rust或Go。本教程将介绍从将PyTorch训练的模型序列化表示,到C++语言_加载_和_执行_的过程。

    第一步:将PyTorch模型转换为Torch Script

    PyTorch模型从Python到C++的转换由Torch Script实现。Torch Script是PyTorch模型的一种表示,可由Torch Script编译器理解,编译和序列化。如果使用基础的“eager”API编写的PyTorch模型,则必须先将模型转换为Torch Script,当然这也是比较容易的。如果已有模型的Torch Script,则可以跳到本教程的下一部分。

    将PyTorch模型转换为Torch Script有两种方法。

    第一种方法是Tracing。该方法通过将样本输入到模型中一次来对该过程进行评估从而捕获模型结构.并记录该样本在模型中的flow。该方法适用于模型中很少使用控制flow的模型。

    第二个方法就是向模型添加显式注释(Annotation),通知Torch Script编译器它可以直接解析和编译模型代码,受Torch Script语言强加的约束。

    小贴士

    可以在官方的Torch Script 参考中找到这两种方法的完整文档,以及有关使用哪个方法的细节指导。

    利用Tracing将模型转换为Torch Script

    要通过tracing来将PyTorch模型转换为Torch脚本,必须将模型的实例以及样本输入传递给torch.jit.trace函数。这将生成一个 torch.jit.ScriptModule对象,并在模块的forward方法中嵌入模型评估的跟踪:

    import torch

    import torchvision

    # 获取模型实例

    model = torchvision.models.resnet18()

    # 生成一个样本供网络前向传播 forward()

    example = torch.rand(1, 3, 224, 224)

    # 使用 torch.jit.trace 生成 torch.jit.ScriptModule 来跟踪

    traced_script_module = torch.jit.trace(model, example)

    现在,跟踪的ScriptModule可以与常规PyTorch模块进行相同的计算:

    In[1]: output = traced_script_module(torch.ones(1, 3, 224, 224))

    In[2]: output[0, :5]

    Out[2]: tensor([-0.2698, -0.0381, 0.4023, -0.3010, -0.0448], grad_fn=)

    通过Annotation将Model转换为Torch Script

    在某些情况下,例如,如果模型使用特定形式的控制流,如果想要直接在Torch Script中编写模型并相应地标注(annotate)模型。例如,假设有以下普通的 Pytorch模型:

    import torch

    class MyModule(torch.nn.Module):

    def __init__(self, N, M):

    super(MyModule, self).__init__()

    self.weight = torch.nn.Parameter(torch.rand(N, M))

    def forward(self, input):

    if input.sum() > 0:

    output = self.weight.mv(input)

    else:

    output = self.weight + input

    return output

    由于此模块的forward方法使用依赖于输入的控制流,因此它不适合利用Tracing的方法生成Torch Script。为此,可以通过继承torch.jit.ScriptModule并将@ torch.jit.script_method标注添加到模型的forward中的方法,来将model转换为ScriptModule:

    import torch

    class MyModule(torch.jit.ScriptModule):

    def __init__(self, N, M):

    super(MyModule, self).__init__()

    self.weight = torch.nn.Parameter(torch.rand(N, M))

    @torch.jit.script_method

    def forward(self, input):

    if input.sum() > 0:

    output = self.weight.mv(input)

    else:

    output = self.weight + input

    return output

    my_script_module = MyModule()

    现在,创建一个新的MyModule对象会直接生成一个可序列化的ScriptModule实例了。

    第二步:将Script Module序列化为一个文件

    不论是从上面两种方法的哪一种方法获得了ScriptModule,都可以将得到的ScriptModule序列化为一个文件,然后C++就可以不依赖任何Python代码来执行该Script所对应的Pytorch模型。

    假设我们想要序列化前面trace示例中显示的ResNet18模型。要执行此序列化,只需在模块上调用 save并给个文件名:

    traced_script_module.save("model.pt")

    这将在工作目录中生成一个model.pt文件。现在可以离开Python,并准备跨越到C ++语言调用。

    第三步:在C++中加载你的Script Module

    要在C ++中加载序列化的PyTorch模型,应用程序必须依赖于PyTorch C ++ API - 也称为_LibTorch_。_LibTorch发行版_包含一组共享库,头文件和CMake构建配置文件。虽然CMake不是依赖LibTorch的要求,但它是推荐的方法,并且将来会得到很好的支持。在本教程中,我们将使用CMake和LibTorch构建一个最小的C++应用程序,加载并执行序列化的PyTorch模型。

    最小的C++应用程序

    以下内容可以做到加载模块:

    #include // One-stop header.

    #include

    #include

    int main(int argc, const char* argv[]) {

    if (argc != 2) {

    std::cerr << "usage: example-app \n";

    return -1;

    }

    // Deserialize the ScriptModule from a file using torch::jit::load().

    std::shared_ptr<:jit::script::module> module = torch::jit::load(argv[1]);

    assert(module != nullptr);

    std::cout << "ok\n";

    }

    头文件包含运行该示例所需的LibTorch库中的所有相关include。main函数接受序列化ScriptModule的文件路径作为其唯一的命令行参数,然后使用torch::jit::load()函数反序列化模块,得到一个指向torch::jit::script::Module的共享指针,相当于C ++中的torch.jit.ScriptModule对象。最后,我们只验证此指针不为null。我们展示如何在接下来执行它。

    依赖库LibTorch和构建应用程序

    我们将上面的代码保存到名为example-app.cpp的文件中。对应的构建它的简单CMakeLists.txt为:

    cmake_minimum_required(VERSION 3.0 FATAL_ERROR)

    project(custom_ops)

    find_package(Torch REQUIRED)

    add_executable(example-app example-app.cpp)

    target_link_libraries(example-app "${TORCH_LIBRARIES}")

    set_property(TARGET example-app PROPERTY CXX_STANDARD 11)

    我们构建示例应用程序的最后一件事是下载LibTorch发行版。从PyTorch网站的下载页面获取最新的稳定版本 download page。如果下载并解压缩最新存档,则有以下目录结构:

    libtorch/

    bin/

    include/

    lib/

    share/

    lib/ 包含含链接的共享库,

    include/ 包含程序需要include的头文件,

    share/包含必要的CMake配置文件使得 find_package(Torch) 。

    小贴士

    在Windows平台上, debug and release builds are not ABI-compatible. 如果要使用debug, 要使用 源码编译 PyTorch方法。

    最后一步是构建应用程序。为此,假设我们的示例目录布局如下:

    example-app/

    CMakeLists.txt

    example-app.cpp

    我们现在可以运行以下命令从example-app/文件夹中构建应用程序:

    mkdir build

    cd build

    cmake -DCMAKE_PREFIX_PATH=/path/to/libtorch ..

    make

    其中 /path/to/libtorch 应该是解压缩的LibTorch发行版的完整路径。如果一切顺利,它将看起来像这样:

    root@4b5a67132e81:/example-app# mkdir build

    root@4b5a67132e81:/example-app# cd build

    root@4b5a67132e81:/example-app/build# cmake -DCMAKE_PREFIX_PATH=/path/to/libtorch ..

    -- The C compiler identification is GNU 5.4.0

    -- The CXX compiler identification is GNU 5.4.0

    -- Check for working C compiler: /usr/bin/cc

    -- Check for working C compiler: /usr/bin/cc -- works

    -- Detecting C compiler ABI info

    -- Detecting C compiler ABI info - done

    -- Detecting C compile features

    -- Detecting C compile features - done

    -- Check for working CXX compiler: /usr/bin/c++

    -- Check for working CXX compiler: /usr/bin/c++ -- works

    -- Detecting CXX compiler ABI info

    -- Detecting CXX compiler ABI info - done

    -- Detecting CXX compile features

    -- Detecting CXX compile features - done

    -- Looking for pthread.h

    -- Looking for pthread.h - found

    -- Looking for pthread_create

    -- Looking for pthread_create - not found

    -- Looking for pthread_create in pthreads

    -- Looking for pthread_create in pthreads - not found

    -- Looking for pthread_create in pthread

    -- Looking for pthread_create in pthread - found

    -- Found Threads: TRUE

    -- Configuring done

    -- Generating done

    -- Build files have been written to: /example-app/build

    root@4b5a67132e81:/example-app/build# make

    Scanning dependencies of target example-app

    [ 50%] Building CXX object CMakeFiles/example-app.dir/example-app.cpp.o

    [100%] Linking CXX executable example-app

    [100%] Built target example-app

    如果我们提供前面的序列化ResNet18模型的路径给example-app,C++输出的结果应该是 OK:

    root@4b5a67132e81:/example-app/build# ./example-app model.pt

    ok

    在C++代码中运行Script Module

    在C ++中成功加载了我们的序列化ResNet18后,我们再加几行执行代码,添加到C++应用程序的main()函数中:

    // Create a vector of inputs.

    std::vector<:jit::ivalue> inputs;

    inputs.push_back(torch::ones({1, 3, 224, 224}));

    // Execute the model and turn its output into a tensor.

    at::Tensor output = module->forward(inputs).toTensor();

    std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << '\n';

    前两行设置我们模型的输入。 创建了一个 torch::jit::IValue (script::Module 对象可接受和返回的一种数据类型) 的向量和添加一个输入。要创建输入张量,我们使用torch::ones()(C++ API)和python中的torch.ones 一样。 然后我们运行script::Module的forward方法,传入我们创建的输入向量,返回一个新的IValue,通过调用toTensor()可将其转换为张量。

    小贴士

    更多关于torch::ones 和 PyTorch的对应 C++ API的内容 https://pytorch.org/cppdocs。PyTorch C++ API 和Python API差不多,可以使你像python 中一样操作处理tensors。

    在最后一行中,我们打印输出的前五个条目。由于我们在本教程前面的Python中为我们的模型提供了相同的输入,因此理想情况下我们应该看到相同的输出。让我们通过重新编译我们的应用程序并使用相同的序列化模型运行它来尝试:

    root@4b5a67132e81:/example-app/build# make

    Scanning dependencies of target example-app

    [ 50%] Building CXX object CMakeFiles/example-app.dir/example-app.cpp.o

    [100%] Linking CXX executable example-app

    [100%] Built target example-app

    root@4b5a67132e81:/example-app/build# ./example-app model.pt

    -0.2698 -0.0381 0.4023 -0.3010 -0.0448

    [ Variable[CPUFloatType]{1,5} ]

    作为参考,之前Python代码的输出是:

    tensor([-0.2698, -0.0381, 0.4023, -0.3010, -0.0448], grad_fn=)

    由此可见,C++的输出与Python的输出是一样的,成功啦!

    小贴士

    将你的模型放到GPU上,可以写成model->to(at::kCUDA);。确保你的输入也在CUDA的存储空间里面,可以使用tensor.to(at::kCUDA)检查,这个函数返回一个新的在CUDA里面的tensor。

    第五步:进阶教程和详细API

    本教程希望能使你理解PyTorch模型从python到c++的调用过程。通过上述教程,你能够通过“eager” PyTorch做一个简单模型,转成ScriptModule,并序列化保存。然后在C++里面通过 script::Module加载运行模型。

    当然,还有好多内容我们没有涉及。举个例子,你希望在C++或者CUDA中实现ScriptModule中的自定义操作,然后就可以在C++调用运行ScriptModule模型。这种是可以做到的,可以参考this。下面还有一些文档可以参考,比较有帮助:

    展开全文
  • 译者:talengu PyTorch的主要接口为Python。虽然Python有动态编程和易于迭代的优势,但很多情况下,正是Python的这些属性会带来不利。...本教程将介绍从将PyTorch训练的模型序列化表示,到C++语言_加载_和_执行_...

    译者:talengu

    PyTorch的主要接口为Python。虽然Python有动态编程和易于迭代的优势,但在很多情况下,正是Python的这些属性会带来不利。我们经常遇到的生产环境,要满足低延迟和严格部署要求。对于生产场景而言,C++通常是首选语言,也能很方便的将其绑定到另一种语言,如Java,Rust或Go。本教程将介绍从将PyTorch训练的模型序列化表示,到C++语言_加载_和_执行_的过程。

    第一步:将PyTorch模型转换为Torch Script

    PyTorch模型从Python到C++的转换由Torch Script实现。Torch Script是PyTorch模型的一种表示,可由Torch Script编译器理解,编译和序列化。如果使用基础的“eager”API编写的PyTorch模型,则必须先将模型转换为Torch Script,当然这也是比较容易的。如果已有模型的Torch Script,则可以跳到本教程的下一部分。

    将PyTorch模型转换为Torch Script有两种方法。
    第一种方法是Tracing。该方法通过将样本输入到模型中一次来对该过程进行评估从而捕获模型结构.并记录该样本在模型中的flow。该方法适用于模型中很少使用控制flow的模型。
    第二个方法就是向模型添加显式注释(Annotation),通知Torch Script编译器它可以直接解析和编译模型代码,受Torch Script语言强加的约束。

    小贴士
    可以在官方的Torch Script 参考中找到这两种方法的完整文档,以及有关使用哪个方法的细节指导。

    利用Tracing将模型转换为Torch Script

    要通过tracing来将PyTorch模型转换为Torch脚本,必须将模型的实例以及样本输入传递给torch.jit.trace函数。这将生成一个 torch.jit.ScriptModule对象,并在模块的forward方法中嵌入模型评估的跟踪:

    import torch
    import torchvision
    
    # 获取模型实例
    model = torchvision.models.resnet18()
    
    # 生成一个样本供网络前向传播 forward()
    example = torch.rand(1, 3, 224, 224)
    
    # 使用 torch.jit.trace 生成 torch.jit.ScriptModule 来跟踪
    traced_script_module = torch.jit.trace(model, example)
    
    

    阅读全文/改进本文

    展开全文
  • 鱼羊 编辑整理量子位 报道 | 公众号 QbitAI编者按:作为一个Java开发者,你是否曾为在PyTorch部署模型而苦恼?这篇来自AWS软件工程师的投稿,结合实例,详细介绍了DJL这个为Java开发者设计的深度学习库:5分钟,你...

    鱼羊 编辑整理量子位 报道 | 公众号 QbitAI

    编者按:作为一个Java开发者,你是否曾为在PyTorch上部署模型而苦恼?这篇来自AWS软件工程师的投稿,结合实例,详细介绍了DJL这个为Java开发者设计的深度学习库:5分钟,你就能在PyTorch上,用Java实现目标检测。

    5分钟,用Java实现目标检测

    文 / 知乎用户@Lanking

    ea993c59ca8a179a0b6b7f50af50bc86.png

    PyTorch在深度学习领域中的应用日趋广泛,得益于它独到的设计。无论是数据的并行处理还是动态计算图,一切都为Python做出了很多简化。很多论文都选择使用PyTorch去实现也证明了它在训练方面的效率以及易用性。

    在PyTorch领域,尽管部署一个模型有很多选择,可为Java开发人员准备的选项却屈指可数。

    在过去,用户可以用PyTorch C++ 写JNI (Java Native Interface) 来实现这个过程。最近,PyTorch 1.4 也发布了试验性的Java 前端。

    可是这两种解决方案都没有办法能让Java开发者很好的使用:用户需要从易于使用和易于维护中二选一。

    针对于这个问题,亚马逊云服务 (AWS)开源了 Deep Java Library (DJL),一个为Java开发者设计的深度学习库。它兼顾了易用性和可维护性,一切运行效率以及内存管理问题都得到了很好的处理。

    DJL使用起来异常简单。只需几行代码,用户就可以轻松部署深度学习模型用作推理。那么我们就开始上手用DJL部署一个PyTorch 模型吧。

    前期准备

    用户可以轻松使用maven或者gradle等Java常用配置管理包来引用DJL。下面是一个示例:

    plugins {

    id 'java'

    }

    repositories {

    jcenter()

    }

    dependencies {

    implementation "ai.djl:api:0.4.0"

    implementation "ai.djl:repository:0.4.0"

    runtimeOnly "ai.djl.pytorch:pytorch-model-zoo:0.4.0"

    runtimeOnly "ai.djl.pytorch:pytorch-native-auto:1.4.0"

    }

    然后只需gradle build,基本配置就大功告成了。

    开始部署模型

    我们用到的目标检测模型来源于NVIDIA在torchhub发布的预训练模型。我们用下面这张图来推理几个可以识别的物体(狗,自行车以及皮卡)。

    b4f32b412006206c5187a6ea22d4682f.png

    可以通过下面的代码来实现推理的过程:

    public static void main(String[] args) throws IOException, ModelException, TranslateException{

    String url = "https://github.com/awslabs/djl/raw/master/examples/src/test/resources/dog_bike_car.jpg";

    BufferedImage img = BufferedImageUtils.fromUrl(url);

    Criteria criteria =

    Criteria.builder()

    .optApplication(Application.CV.OBJECT_DETECTION)

    .setTypes(BufferedImage.class, DetectedObjects.class)

    .optFilter("backbone", "resnet50")

    .optProgress(new ProgressBar())

    .build();

    try (ZooModel model = ModelZoo.loadModel(criteria)) {

    try (Predictor predictor = model.newPredictor()) {

    DetectedObjects detection = predictor.predict(img);

    System.out.println(detection);

    }

    }

    }

    然后,就结束了。相比于其他解决方案动辄上百行的代码,DJL把所有过程简化到了不到30行完成。那么我们看看输出的结果:

    [

    class: "dog", probability: 0.96709, bounds: [x=0.165, y=0.348, width=0.249, height=0.539]

    class: "bicycle", probability: 0.66796, bounds: [x=0.152, y=0.244, width=0.574, height=0.562]

    class: "truck", probability: 0.64912, bounds: [x=0.609, y=0.132, width=0.284, height=0.166]

    ]

    你也可以用我们目标检测图形化API来看一下实际的检测效果:

    3ce3917e1a9a278809f2a3a11739b9fa.png

    你也许会说,这些代码都包装的过于厉害,真正的小白该如何上手呢?

    让我们仔细的看一下刚才的那段代码:

    // 读取一张图片

    String url = "https://github.com/awslabs/djl/raw/master/examples/src/test/resources/dog_bike_car.jpg";

    BufferedImage img = BufferedImageUtils.fromUrl(url);

    // 创建一个模型的寻找标准

    Criteria criteria =

    Criteria.builder()

    // 设置应用类型:目标检测

    .optApplication(Application.CV.OBJECT_DETECTION)

    // 确定输入输出类型 (使用默认的图片处理工具)

    .setTypes(BufferedImage.class, DetectedObjects.class)

    // 模型的过滤条件

    .optFilter("backbone", "resnet50")

    .optProgress(new ProgressBar())

    .build();

    // 创建一个模型对象

    try (ZooModel model = ModelZoo.loadModel(criteria)) {

    // 创建一个推理对象

    try (Predictor predictor = model.newPredictor()) {

    // 推理

    DetectedObjects detection = predictor.predict(img);

    System.out.println(detection);

    }

    }

    这样是不是清楚了很多?DJL建立了一个模型库(ModelZoo)的概念,引入了来自于GluonCV, TorchHub, Keras 预训练模型, huggingface自然语言处理模型等70多个模型。所有的模型都可以一键导入,用户只需要使用默认或者自己写的输入输出工具就可以实现轻松的推理。我们还在不断的添加各种预训练模型。

    了解DJL

    4a87873d831bcf06cf7bbbe1b74e8ee9.png

    DJL是亚马逊云服务在2019年re:Invent大会推出的专为Java开发者量身定制的深度学习框架,现已运行在亚马逊数以百万的推理任务中。

    如果要总结DJL的主要特色,那么就是如下三点:

    DJL不设限制于后端引擎:用户可以轻松的使用 MXNet, PyTorch, TensorFlow和fastText来在Java上做模型训练和推理。

    DJL的算子设计无限趋近于numpy:它的使用体验上和numpy基本是无缝的,切换引擎也不会造成结果改变。

    DJL优秀的内存管理以及效率机制:DJL拥有自己的资源回收机制,100个小时连续推理也不会内存溢出。

    James Gosling (Java 创始人) 在使用后给出了赞誉:

    454a8928f3884d0e75fc00136df5c30c.png

    对于PyTorch的支持

    DJL现已支持PyTorch 1.5。我们深度整合了PyTorch C++ API,开发了一套JNI提供Java的底层支持。DJL提供各类PyTorch原生算子算法,现在支持所有的 TorchScript模型。

    现在可以在 Mac/Linux/Windows全平台运行DJL PyTorch。DJL具有自检测CUDA版本的功能,也会自动采用对应的CUDA版本包来运行gpu任务。

    想了解更多,请参见下面几个链接:

    https://djl.ai

    https://github.com/awslabs/djl

    也欢迎加入我们slack论坛:

    https://app.slack.com/client/TPX8YGQTW

    — 完 —

    本文系网易新闻•网易号特色内容激励计划签约账号【量子位】原创内容,未经账号授权,禁止随意转载。

    喜欢就点「在看」吧 !

    展开全文
  • 文 / 知乎用户@LankingPyTorch深度学习领域的应用日趋广泛,得益于它独到的...在PyTorch领域,尽管部署一个模型有很多选择,可为Java开发人员准备的选项却屈指可数。过去,用户可以用PyTorch C++ 写JNI (Java...

    文 / 知乎用户@Lanking

    d9647f3082869796d7db12a702db648f.png

    PyTorch在深度学习领域中的应用日趋广泛,得益于它独到的设计。无论是数据的并行处理还是动态计算图,一切都为Python做出了很多简化。很多论文都选择使用PyTorch去实现也证明了它在训练方面的效率以及易用性。

    在PyTorch领域,尽管部署一个模型有很多选择,可为Java开发人员准备的选项却屈指可数。

    在过去,用户可以用PyTorch C++ 写JNI (Java Native Interface) 来实现这个过程。最近,PyTorch 1.4 也发布了试验性的Java 前端。

    可是这两种解决方案都没有办法能让Java开发者很好的使用:用户需要从易于使用和易于维护中二选一。

    针对于这个问题,亚马逊云服务 (AWS)开源了 Deep Java Library (DJL),一个为Java开发者设计的深度学习库。它兼顾了易用性和可维护性,一切运行效率以及内存管理问题都得到了很好的处理。

    DJL使用起来异常简单。只需几行代码,用户就可以轻松部署深度学习模型用作推理。那么我们就开始上手用DJL部署一个PyTorch 模型吧。

    前期准备

    用户可以轻松使用maven或者gradle等Java常用配置管理包来引用DJL。下面是一个示例:

    plugins {

    id 'java'

    }

    repositories {

    jcenter()

    }

    dependencies {

    implementation "ai.djl:api:0.4.0"

    implementation "ai.djl:repository:0.4.0"

    runtimeOnly "ai.djl.pytorch:pytorch-model-zoo:0.4.0"

    runtimeOnly "ai.djl.pytorch:pytorch-native-auto:1.4.0"

    }

    然后只需gradle build,基本配置就大功告成了。

    开始部署模型

    我们用到的目标检测模型来源于NVIDIA在torchhub发布的预训练模型。我们用下面这张图来推理几个可以识别的物体(狗,自行车以及皮卡)。

    3cb14fa864e680510c7f16d48cfe8df3.png

    可以通过下面的代码来实现推理的过程:

    publicstaticvoidmain(String[] args)throws IOException, ModelException, TranslateException{

    String url = "https://github.com/awslabs/djl/raw/master/examples/src/test/resources/dog_bike_car.jpg";

    BufferedImage img = BufferedImageUtils.fromUrl(url);

    Criteria criteria =

    Criteria.builder()

    .optApplication(Application.CV.OBJECT_DETECTION)

    .setTypes(BufferedImage.class, DetectedObjects.class)

    .optFilter("backbone", "resnet50")

    .optProgress(new ProgressBar())

    .build();

    try (ZooModel model = ModelZoo.loadModel(criteria)) {

    try (Predictor predictor = model.newPredictor()) {

    DetectedObjects detection = predictor.predict(img);

    System.out.println(detection);

    }

    }

    }

    然后,就结束了。相比于其他解决方案动辄上百行的代码,DJL把所有过程简化到了不到30行完成。那么我们看看输出的结果:

    [

    class: "dog", probability: 0.96709, bounds: [x=0.165, y=0.348, width=0.249, height=0.539]

    class: "bicycle", probability: 0.66796, bounds: [x=0.152, y=0.244, width=0.574, height=0.562]

    class: "truck", probability: 0.64912, bounds: [x=0.609, y=0.132, width=0.284, height=0.166]

    ]

    你也可以用我们目标检测图形化API来看一下实际的检测效果:

    898f4e9edacd69fa1aa2bbb8cad2a948.png

    你也许会说,这些代码都包装的过于厉害,真正的小白该如何上手呢?

    让我们仔细的看一下刚才的那段代码:

    // 读取一张图片

    String url = "https://github.com/awslabs/djl/raw/master/examples/src/test/resources/dog_bike_car.jpg";

    BufferedImage img = BufferedImageUtils.fromUrl(url);

    // 创建一个模型的寻找标准

    Criteria criteria =

    Criteria.builder()

    // 设置应用类型:目标检测

    .optApplication(Application.CV.OBJECT_DETECTION)

    // 确定输入输出类型 (使用默认的图片处理工具)

    .setTypes(BufferedImage.class, DetectedObjects.class)

    // 模型的过滤条件

    .optFilter("backbone", "resnet50")

    .optProgress(new ProgressBar())

    .build();

    // 创建一个模型对象

    try (ZooModel model = ModelZoo.loadModel(criteria)) {

    // 创建一个推理对象

    try (Predictor predictor = model.newPredictor()) {

    // 推理

    DetectedObjects detection = predictor.predict(img);

    System.out.println(detection);

    }

    }

    这样是不是清楚了很多?DJL建立了一个模型库(ModelZoo)的概念,引入了来自于GluonCV, TorchHub, Keras 预训练模型, huggingface自然语言处理模型等70多个模型。所有的模型都可以一键导入,用户只需要使用默认或者自己写的输入输出工具就可以实现轻松的推理。我们还在不断的添加各种预训练模型。

    了解DJL

    e2ed947f259d62eda98e1a6fca24ceeb.png

    DJL是亚马逊云服务在2019年re:Invent大会推出的专为Java开发者量身定制的深度学习框架,现已运行在亚马逊数以百万的推理任务中。

    如果要总结DJL的主要特色,那么就是如下三点:

    DJL不设限制于后端引擎:用户可以轻松的使用 MXNet, PyTorch, TensorFlow和fastText来在Java上做模型训练和推理。

    DJL的算子设计无限趋近于numpy:它的使用体验上和numpy基本是无缝的,切换引擎也不会造成结果改变。

    DJL优秀的内存管理以及效率机制:DJL拥有自己的资源回收机制,100个小时连续推理也不会内存溢出。

    James Gosling (Java 创始人) 在使用后给出了赞誉:

    59e472ad21e36a2390bb9fbb3b13221b.png

    对于PyTorch的支持

    DJL现已支持PyTorch 1.5。我们深度整合了PyTorch C++ API,开发了一套JNI提供Java的底层支持。DJL提供各类PyTorch原生算子算法,现在支持所有的 TorchScript模型。

    现在可以在 Mac/Linux/Windows全平台运行DJL PyTorch。DJL具有自检测CUDA版本的功能,也会自动采用对应的CUDA版本包来运行gpu任务。

    想了解更多,请参见下面几个链接:

    https://djl.ai

    https://github.com/awslabs/djl

    也欢迎加入我们slack论坛:

    https://app.slack.com/client/TPX8YGQTW

    本文系网易新闻•网易号特色内容激励计划签约账号【量子位】原创内容,未经账号授权,禁止随意转载。

    报名 | 智慧生活行业私享会

    欢迎报名,与峰瑞资本、、网易有道、思必驰、九号、视感科技、云丁科技等企业高管,共同探讨如何借力资本市场、把握行业趋势,打造全场景智慧生活:

    量子位QbitAI · 头条号签约作者

    վ'ᴗ' ի 追踪AI技术和产品新动态

    海量资讯、精准解读,尽在新浪财经APP

    展开全文
  • PyTorch在深度学习领域的应用日趋广泛,得力于它独到的设计。...在PyTorch领域,尽管部署一个模型有很多选择,可为Java开发人员准备的选项却屈指可数。过去,用户可以用PyTorch C++ 写JNI (Java Native Interfac...
  • 5分钟,用Java实现目标检测文 / 知乎用户@LankingPyTorch深度学习领域的应用日趋广泛,得益于它...在PyTorch领域,尽管部署一个模型有很多选择,可为Java开发人员准备的选项却屈指可数。过去,用户可以用Py...
  • 鱼羊 编辑整理量子位 报道 | 公众号 QbitAI编者按:作为一个Java开发者,你是否曾为在PyTorch部署模型而苦恼?这篇来自AWS软件工程师的投稿,结合实例,详细介绍了DJL这个为Java开发者设计的深度学习库:5分钟,你...
  • 鱼羊 编辑整理量子位 报道 | 公众号 QbitAI编者按:作为一个Java开发者,你是否曾为在PyTorch部署模型而苦恼?这篇来自AWS软件工程师的投稿,结合实例,详细介绍了DJL这个为Java开发者设计的深度学习库:5分钟,你...
  • PyTorch在深度学习领域的应用日趋广泛,得力于它独到的设计。...在PyTorch领域,尽管部署一个模型有很多选择,可为Java开发人员准备的选项却屈指可数。过去,用户可以用PyTorch C++ 写JNI (Java Native Interfac...
  • 鱼羊 编辑整理量子位 报道 | 公众号 QbitAI编者按:作为一个Java开发者,你是否曾为在PyTorch部署模型而苦恼?这篇来自AWS软件工程师的投稿,结合实例,详细介绍了DJL这个为Java开发者设计的深度学习库:5分钟,你...
  • 鱼羊 编辑整理量子位 报道 | 公众号 QbitAI编者按:作为一个Java开发者,你是否曾为在PyTorch部署模型而苦恼?这篇来自AWS软件工程师的投稿,结合实例,详细介绍了DJL这个为Java开发者设计的深度学习库:5分钟,你...
  • 鱼羊 编辑整理量子位 报道 | 公众号 QbitAI编者按:作为一个Java开发者,你是否曾为在PyTorch部署模型而苦恼?这篇来自AWS软件工程师的投稿,结合实例,详细介绍了DJL这个为Java开发者设计的深度学习库:5分钟,你...
  • 鱼羊 编辑整理量子位 报道 | 公众号 QbitAI编者按:作为一个Java开发者,你是否曾为在PyTorch部署模型而苦恼?这篇来自AWS软件工程师的投稿,结合实例,详细介绍了DJL这个为Java开发者设计的深度学习库:5分钟,你...
  • 顾名思义,PyTorch的主要接口是Python编程语言。尽管Python是合适于许多...对于生产场景,即使只将C ++绑定到Java,Rust或Go之类的另一种语言,它也是经常选择的语言。以下各段将概述PyTorch提供的从现有Python模...
  • 本教程已更新为可与PyTorch 1.2一起使用 顾名思义,PyTorch的主要接口是Python编程语言。尽管Python是合适于许多需要动态性和易于迭代的场景,并且是首选的语言,但...步骤1:将PyTorch模型转换为Torch脚本 PyTorch模
  • C 加载TorchScript模型

    千次阅读 2020-01-29 20:51:30
    本教程已更新为可与PyTorch 1.2一起使用 顾名思义,PyTorch的主要接口是Python编程语言。尽管Python是合适于许多...对于生产场景,即使只将C 绑定到Java,Rust或Go之类的另一种语言,它也是经常选择的语言。以下...
  • C++加载TorchScript模型 本教程已更新为可与PyTorch 1.2一起使用 顾名思义,PyTorch的主要接口是Python编程语言。尽管Python是合适于许多需要动态性和易于迭代的场景,并且是首选的语言,但同样的, 许多情况...
  • 顾名思义,PyTorch的主要接口是Python编程语言。尽管Python是许多需要动态性和易于迭代的场景的合适且首选的语言,但同样许多情况下,Python的这些属性恰恰是不利的。后者通常适用的一种...步骤1:将PyTorch模型..
  • 本文通过一个图像分类模型为实例,引导您一步步完成 Apache Spark 上利用 DJL 大数据生产环境中部署 TensorFlow,PyTorch,以及 MXNet 等模型。前言深度学习大数据领域上的应用日趋广泛,可是 Java/Scala 上...
  • 顾名思义,PyTorch的主要接口是Python编程语言。...对于生产场景,即使只将C ++绑定到Java,Rust或Go之类的另一种语言,它通常也是首选语言。以下段落将概述PyTorch提供的从现有Python模型到可...
  • Seldon Core的安装量超过200万,整个组织用于管理机器学习模型的大规模部署,其主要优势包括: 使用我们, 或来轻松ML模型的简便方法。 开箱即用的端点,可以通过 , 。 与云无关,并。 由强大而丰富的...
  • Java 机器学习库 Tribuo

    2020-09-18 22:44:50
    Oracle开源了一个用 Java 编写的机器学习库,名为Tribuo。...其中,对 onnx 模型的支持允许 Java 中部署一些 Python 软件包(例如 pytorch)训练的模型。 Tribuo 目前支持 Java 8 及更高版本。Oracle 表示该机...
  • PyTorch在深度学习领域的应用日趋广泛,得益于它独到的设计。...在PyTorch领域,尽管部署一个模型有很多选择,可为Java开发人员准备的选项却屈指可数。过去,用户可以用PyTorch C++ 写JNI (Java Native Interfac...
  • 鱼羊 编辑整理量子位 报道 | 公众号 QbitAI编者按:作为一个Java开发者,你是否曾为在PyTorch部署模型而苦恼?这篇来自AWS软件工程师的投稿,结合实例,详细介绍了DJL这个为Java开发者设计的深度学习库:5分钟,你...
  • PyTorch在深度学习领域的应用日趋广泛,得益于它独到的设计。...在PyTorch领域,尽管部署一个模型有很多选择,可为Java开发人员准备的选项却屈指可数。过去,用户可以用PyTorch C++ 写JNI (Java Native Inter...
  • 使用Python进行培训,但可以部署到C#/ C ++ / Java应用程序 不同的硬件和操作系统上运行 多个不同框架创建的支持模型 自2019年10月以来, API稳定且可投入生产,可实现更快的客户体验和更低的成本。 2020...
  • 如果您手模型是由诸如Caffe、Tensorflow、PyTorch等框架产出的,那么您可以使用 X2Paddle 工具将模型转换为PadddlePaddle格式。 二. 模型优化 Paddle Lite框架拥有优秀的加速、优化策略及实现,包含量化、子图...

空空如也

空空如也

1 2
收藏数 32
精华内容 12
关键字:

在java中部署pytorch模型

java 订阅