美文网首页
SKIL/工作流程/SKIL中在多GPU上训练

SKIL/工作流程/SKIL中在多GPU上训练

作者: hello风一样的男子 | 来源:发表于2019-04-19 17:15 被阅读0次

SKIL中在多GPU上训练

训练神经网络模型可能是一项计算代价很高的任务。如果你的机器上安装了多个GPU,为了加快训练过程,你可以选择并行训练你的模型。
SKIL可以使用 skil parallelwrapper命令利用机器中安装的GPU。在本指南中,你将看到如何在多个GPU上的MNIST数据集上训练DL4J网络。
在继续本指南之前,请确保已将SKIL配置为GPU模式。
先决条件
你需要遵循以下步骤:

  1. SKIL
  2. 一个或多个GPU 在你的机器中

使用“skil parallelwrapper”进行分布式训练的组件

1. DataSetIteratorProviderFactory接口实现

为了为你的网络提供数据你需要实现org.deeplearning4j.parallelism.main.DataSetIteratorProviderFactory接口。这个接口定义如下:

import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;

public interface DataSetIteratorProviderFactory {
    DataSetIterator create();
}
image.gif

SKIL提供此接口的默认实现(io.skymind.skil.parallelwrapper.MnistDataSetIteratorProviderFactory),用于提供MNIST数据。在Java中的实现如下:

import org.deeplearning4j.datasets.iterator.impl.MnistDataSetIterator;
import org.deeplearning4j.parallelism.main.DataSetIteratorProviderFactory;
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;

import java.io.IOException;

public class MnistDataSetIteratorProviderFactory implements DataSetIteratorProviderFactory {
    @Override
    public DataSetIterator create() {
        try {
            return new MnistDataSetIterator(100, 1000);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
image.gif

2. 神经网络配置

最后,要训练的神经网络配置。示例配置(在scala中)如下(对于MultiLayerNetwork

import org.deeplearning4j.nn.api.Model
import org.deeplearning4j.nn.api.OptimizationAlgorithm
import org.deeplearning4j.nn.conf.MultiLayerConfiguration
import org.deeplearning4j.nn.conf.NeuralNetConfiguration
import org.deeplearning4j.nn.conf.inputs.InputType
import org.deeplearning4j.nn.conf.layers.ConvolutionLayer
import org.deeplearning4j.nn.conf.layers.DenseLayer
import org.deeplearning4j.nn.conf.layers.OutputLayer
import org.deeplearning4j.nn.conf.layers.SubsamplingLayer
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork
import org.deeplearning4j.nn.weights.WeightInit
import org.deeplearning4j.spark.impl.paramavg.ParameterAveragingTrainingMaster
import org.deeplearning4j.util.ModelSerializer
import org.nd4j.linalg.activations.Activation
import org.nd4j.linalg.learning.config.Nesterovs
import org.nd4j.linalg.lossfunctions.LossFunctions

import java.io.File;
//如上所述的训练迭代
var builder = new NeuralNetConfiguration.Builder().seed(230) 
        .l2(0.0005)
        .weightInit(WeightInit.XAVIER)
        .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
        .updater(Nesterovs.builder().learningRate(0.01).momentum(0.9).build())
        .list()
        .layer(0, new ConvolutionLayer.Builder(5, 5)

         //nIn和nOut指定深度。这里是nChannels,nOut是要应用的过滤器的数量。
                .nIn(1).stride(1, 1).nOut(20).activation(Activation.IDENTITY).build())
        .layer(1, new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX).kernelSize(2, 2)
                .stride(2, 2).build())
        .layer(2, new ConvolutionLayer.Builder(5, 5)
                //注意,不需要在后面的层中指定nIn
                .stride(1, 1).nOut(50).activation(Activation.IDENTITY).build())
        .layer(3, new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX).kernelSize(2, 2)
                .stride(2, 2).build())
        .layer(4, new DenseLayer.Builder().activation(Activation.RELU).nOut(500).build())
        .layer(5, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD).nOut(10)
                .activation(Activation.SOFTMAX).build())
         //见下面的备注
        .setInputType(InputType.convolutionalFlat(28, 28, 1)) 
        .backprop(true).pretrain(false);
var network = new MultiLayerNetwork(builder.build());
network.init();

//把模型写入文件
var neuralNet = new File("/tmp", "neuralnet.bin")
neuralNet.createNewFile()
ModelSerializer.writeModel(network, neuralNet, true);
image.gif

使用“skil parallelwrapper”命令
要使用skil parellelwrapper命令,你需要使用 ModelSerializer#writeModel函数将模型配置写入文件(同样,如上述网络代码所示)。之后,你将能够使用skil parallelwrapper命令,如下所示:

$SKIL_HOME/sbin/skil login --userId admin --password admin #你可能有不同的用户名和密码,请相应地替换它们。.

$SKIL_HOME/sbin/skil parallelwrapper --modelPath "/tmp/neuralnet.bin" --dataSetIteratorFactoryClazz "io.skymind.skil.parallelwrapper.MnistDataSetIteratorProviderFactory" --modelOutputPath "/tmp/neuralnet_out.bin" --uiUrl localhost:9002 --evalDataSetProviderClass "io.skymind.skil.parallelwrapper.MnistDataSetIteratorProviderFactory" --evalType "evaluation"
image.gif

上面的命令将从--modelPath获取模型配置,通过--dataSetIteratorFactoryClazz指定的工厂类使用数据在可用的GPU上对其进行训练,并将输出保存在--modelOutputPath。它还将使用与--evalDataSetProviderClass指定的同一工厂类评估模型,并在--uiUrl指定的URL上显示流程。

相关文章

  • SKIL/工作流程/SKIL中在多GPU上训练

    SKIL中在多GPU上训练 训练神经网络模型可能是一项计算代价很高的任务。如果你的机器上安装了多个GPU,为了加快...

  • SKIL/工作流程/SKIL上的分布式训练

    SKIL中的分布式训练 SKIL提供了skil spark命令,用于在spark 集群上对DL4J模型进行分布式训...

  • SKIL/配置/GPU模式

    GPU模式 默认情况下,SKIL未配置为使用本地可用的GPU资源。此外,你还需要确保SKIL在本地安装了CUDA,...

  • SKIL/工作流程/在实验中训练模型

    在实验中训练模型 如果你想跟踪结果并进行可重复的评估,实验对于训练模型很有用。一旦你学习了工作间,笔记本和进行实验...

  • SKIL/安装/多服务器安装

    安装 - 多服务器 在多个服务器上安装skil遵循与在单个服务器上安装skil相同的安装路径,但还有一些附加要求。...

  • SKIL/工作流程/嵌入式SKIL

    嵌入式SKIL 除了提供几乎所有用于创建高效机器学习管道的工具之外,SKIL还可以非常方便地作为嵌入式应用程序。这...

  • SKIL/工作流程/与SKIL客户端一起工作

    与SKIL客户端一起工作 SKIL可以通过外部环境通过SKIL Clients使用。外部环境可以是笔记本,也可以是...

  • SKIL/配置/环境用户界面

    环境用户界面 除了在/etc/skil/skil-env.sh文件中进行更改以更新SKIL环境变量外,还可以使用“...

  • SKIL/安装/更新

    更新SKIL SKIL不断被Skymind开发成越来越多功能丰富的应用程序。因此,为了在SKIL中使用新功能,你需...

  • SKIL/开始/系统要求/多服务器要求

    多服务器要求SKIL可以在单节点和多节点配置中工作。在多节点设置中,你可以利用不同的机器扩展模型服务或训练,以满足...

网友评论

      本文标题:SKIL/工作流程/SKIL中在多GPU上训练

      本文链接:https://www.haomeiwen.com/subject/ltscgqtx.html