Рубрики
Без рубрики

Как сделать глубокое обучение для Java?

создавайте и оценивайте модели глубокого обучения в облаке, используя Java-библиотеку DeepLearning4j. С тегами cloud, java, graal vm, глубокое обучение.

Некоторое время назад я наткнулся на этот инструмент управления жизненным циклом (или облачный сервис) под названием Aloha и я был весьма впечатлен его пользовательским интерфейсом и простотой дизайна и компоновки. В то время я хорошо поболтал об этом сервисе с одним из участников Aloha , и мне дали демо-версию. До этого я написал простой конвейер, используя GNU Parallel , JavaScript, Python и Bash, а другой – чисто используя GNU Parallel и Bash. Я также думал о замене движущихся частей готовыми к использованию инструментами управления задачами/рабочими процессами, такими как Jenkins X, Jenkins Pipeline, Concourse или Airflow, но по разным причинам я не стал развивать эту идею.

Возвращаясь к нашему первоначальному разговору, я заметил, что многие примеры и документы на Valuation были основаны на Python и R, а также на соответствующих фреймворках и библиотеках. Не хватало примеров или документов на основе Java/JVM. Поэтому я воспользовался этой возможностью, чтобы что-то с этим сделать.

Я был воодушевлен Valohai реализовать что-то с помощью знаменитой библиотеки Java под названием DL4J Глубокое обучение для Java .

Мой первоначальный опыт работы с Валохай уже произвел на меня хорошее впечатление после ознакомления с его дизайном, компоновкой и рабочим процессом. Что он удобен для разработчиков, и создатели уже приняли во внимание различные аспекты рабочих процессов как разработчика, так и инфраструктуры. В наших мирах последний в основном управляется командами DevOps или SysOps, и мы знаем нюансы и болевые точки, связанные с ним. Вы можете узнать больше о его функциях в разделе Features сайта.

Ахтунг! Просто чтобы вы знали, что с этого момента пост будет немного более техническим и может содержать фрагменты кода и упоминания о глубоком обучении/машинном обучении и терминологии, связанной с инфраструктурой.

Для любого проекта или инициативы по машинному обучению или глубокому обучению в наши дни двумя важными компонентами (с точки зрения высокого уровня) являются код, который будет создавать и обслуживать модель и инфраструктуру, в которых будет выполняться весь этот жизненный цикл.

Конечно, будут шаги и компоненты, необходимые до, во время и после вышеупомянутого, но для простоты давайте предположим, что нам нужен код и инфраструктура.

Код Для кода я выбрал модифицированный пример с использованием DL4J, это проект MNIST с обучающим набором из 60 000 изображений и тестовым набором из 10 000 изображений рукописных цифр. Этот набор данных доступен через библиотеку DL4J (точно так же, как Keras предоставляет их запас). Найдите итератор набора данных Mnist/| в разделе Преобразователь данных в шпаргалке DL4J/| для получения более подробной информации об этом конкретном наборе данных.

Взгляните на исходный код, который мы будем использовать, прежде чем приступить к работе, основной класс Java называется org.deeplearning4j.feedforward.mnist. MLPMnistSingleLayerRunner .

Инфраструктура Как уже очевидно, мы решили опробовать пример Java, используя Aloha в качестве нашей инфраструктуры для проведения наших экспериментов (обучение и оценка модели). Valohai распознает репозитории git и напрямую подключается к ним и позволяет выполнять наш код, независимо от платформы или языка – мы увидим, как это работает. Это также означает, что если вы являетесь убежденным сторонником Gi Tops или Инфраструктура как код вы по достоинству оцените рабочий процесс.

Для этого нам просто нужна учетная запись на Valohai , мы можем воспользоваться Учетной записью бесплатного уровня и иметь доступ к нескольким экземплярам различных конфигураций, когда мы зарегистрируемся . Смотрите Бесплатный уровень в разделе Планы и цены и сравнительную таблицу для получения более подробной информации. Для того, что мы хотели бы сделать, свободного уровня на данный момент более чем достаточно.

Как мы и договаривались, мы собираемся использовать эти две технологии для достижения нашей цели обучения одноуровневой модели и ее оценки, а также для того, чтобы увидеть, как выглядит сквозной опыт на Валохай .

Мы объединим необходимые зависимости сборки и времени выполнения в образ Docker и будем использовать его для создания нашего Java-приложения, обучения модели и оценки ее на платформе Valohai с помощью простого valohai.yaml файл, который помещается в корневую папку репозитория проекта.

Глубокое обучение для Java: DL4J

Самое простое заключается в том, что здесь нам не нужно будет много делать, просто создайте jar и загрузите набор данных в контейнер Docker. У нас есть предварительно созданный образ Docker, который содержит все зависимости, необходимые для создания Java-приложения. Мы поместили это изображение в Docker Hub , вы можете найти его, выполнив поиск по dl4j-mnist-single-layer (мы будем использовать определенный тег, как определено в файле YAML). Мы решили использовать Graal VM 19.1.1 как наша сборка Java и среда выполнения для этого проекта, и поэтому он встроен в образ Docker (см. Dockerfile для определения образа Docker). Чтобы узнать больше о Грэме, ознакомьтесь с ресурсами на официальном сайте graalvm.org и Удивительный Грааль .

Оркестровка Когда uber jar вызывается из командной строки, мы попадаем в MLPMnistSingleLayerRunner класс, который направляет нас к предполагаемому действию в зависимости от параметров, переданных в:

    public static void main(String[] args) throws Exception {
        MLPMnistSingleLayerRunner mlpMnistRunner = new MLPMnistSingleLayerRunner();

        JCommander.newBuilder()
                .addObject(mlpMnistRunner)
                .build()
                .parse(args);

        mlpMnistRunner.execute();
    }

Параметры, передаваемые в uberjar, принимаются этим классом и обрабатываются методом execute() .

Мы можем создать модель с помощью параметра -- action train и оценить созданную модель с помощью параметра --action evaluate , соответственно переданного в Java-приложение (uber jar).

Основные части приложения Java, которое выполняет эту работу, можно найти в двух классах Java, упомянутых в разделах ниже.

Обучите модель

Может быть вызван из командной строки с помощью:

    ./runMLPMnist.sh --action train --output-dir ${VH_OUTPUTS_DIR}

    or

    java -Djava.library.path=""             \
         -jar target/MLPMnist-1.0.0-bin.jar \
         --action train --output-dir ${VH_OUTPUTS_DIR}

Это создает модель (в случае успеха, в конце выполнения) по имени Это создает модель (в случае успеха, в конце выполнения) по имени в папке, указанной --output-dir , переданной в начале выполнения. С точки зрения Valohai , он должен быть помещен в ${VH_OUTPUTS_DIR}, что мы и делаем (см. valohai.yaml файл).

Исходный код см. в разделе class MLPMNistSingleLayerTrain.java ,

Оценить модель

Может быть вызван из командной строки с помощью:

    ./runMLPMnist.sh --action evaluate --input-dir ${VH_INPUTS_DIR}/model

    or

    java -Djava.library.path=""             \
         -jar target/MLPMnist-1.0.0-bin.jar \
         --action evaluate --input-dir ${VH_INPUTS_DIR}/model

При этом ожидается модель (созданная на этапе обучения) с именем mlpmnist-single-layer.pb должен присутствовать в папке, указанной --input-dir , переданной при вызове приложения.

Исходный код см. в разделе class MLPMNistSingleLayerEvaluate.java .

Я надеюсь, что эта короткая иллюстрация прояснит, как работает Java-приложение, которое обучает и оценивает модель в целом.

Это все, что от нас требуется, но не стесняйтесь играть с остальными source (вместе с README.md и скрипты bash) и удовлетворить ваше любопытство и понимание того, как это делается! Дополнительные ресурсы о том, как работать с DL4J, были предоставлены в разделе Ресурсы в конце поста.

Валохай

Valohai как платформа позволяет нам свободно связывать вашу среду выполнения, наш код и наш набор данных, как вы можете видеть из структуры файла YAML ниже. Таким образом, различные компоненты могут развиваться независимо, не мешая и не завися друг от друга. Следовательно, в наш контейнер Docker упакованы только компоненты сборки и времени выполнения. Во время выполнения мы создаем uber jar в контейнере Docker, загружаем его в какое-либо внутреннее или внешнее хранилище, а затем на другом этапе выполнения загружаем uber jar и набор данных из хранилища (или другого места) для запуска обучения. Таким образом, два этапа выполнения разделены; мы можем, например, создать jar один раз и выполнить сотни обучающих шагов на одном и том же jar. Поскольку среды сборки и выполнения не должны меняться так часто, мы можем кэшировать их, а исходный код, набор данных и модели могут быть динамически доступны во время выполнения.

валохай.yaml Суть интеграции вашего Java-проекта с инфраструктурой цепочки создания стоимости заключается в определении шагов Выполнения шагов в valohai.файл yaml помещен в корень папки вашего проекта. Наш валохай.yaml выглядит так:

    ---

    - step:
        name: Build-dl4j-mnist-single-layer-java-app
        image: neomatrix369/dl4j-mnist-single-layer:v0.5
        command:
          - cd ${VH_REPOSITORY_DIR}
          - ./buildUberJar.sh
          - echo "~~~ Copying the build jar file into ${VH_OUTPUTS_DIR}"
          - cp target/MLPMnist-1.0.0-bin.jar ${VH_OUTPUTS_DIR}/MLPMnist-1.0.0.jar
          - ls -lash ${VH_OUTPUTS_DIR}
        environment: aws-eu-west-1-g2-2xlarge
    - step:
        name: Run-dl4j-mnist-single-layer-train-model
        image: neomatrix369/dl4j-mnist-single-layer:v0.5
        command:
          - echo "~~~ Unpack the MNist dataset into ${HOME} folder"
          - tar xvzf ${VH_INPUTS_DIR}/dataset/mlp-mnist-dataset.tgz -C ${HOME}
          - cd ${VH_REPOSITORY_DIR}
          - echo "~~~ Copying the build jar file from ${VH_INPUTS_DIR} to current location"
          - cp ${VH_INPUTS_DIR}/dl4j-java-app/MLPMnist-1.0.0.jar .
          - echo "~~~ Run the DL4J app to train model based on the the MNist dataset"
          - ./runMLPMnist.sh {parameters}
        inputs:
          - name: dl4j-java-app
            description: DL4J Java app file (jar) generated in the previous step 'Build-dl4j-mnist-single-layer-java-app'
          - name: dataset
            default: https://github.com/neomatrix369/awesome-ai-ml-dl/releases/download/mnist-dataset-v0.1/mlp-mnist-dataset.tgz
            description: MNist dataset needed to train the model
        parameters:
          - name: --action
            pass-as: '--action {v}'
            type: string
            default: train
            description: Action to perform i.e. train or evaluate
          - name: --output-dir
            pass-as: '--output-dir {v}'
            type: string
            default: /valohai/outputs/
            description: Output directory where the model will be created, best to pick the Valohai output directory
        environment: aws-eu-west-1-g2-2xlarge

    - step:
        name: Run-dl4j-mnist-single-layer-evaluate-model
        image: neomatrix369/dl4j-mnist-single-layer:v0.5
        command:
          - cd ${VH_REPOSITORY_DIR}
          - echo "~~~ Copying the build jar file from ${VH_INPUTS_DIR} to current location"
          - cp ${VH_INPUTS_DIR}/dl4j-java-app/MLPMnist-1.0.0.jar .
          - echo "~~~ Run the DL4J app to evaluate the trained MNist model"
          - ./runMLPMnist.sh {parameters}
        inputs:
          - name: dl4j-java-app
            description: DL4J Java app file (jar) generated in the previous step 'Build-dl4j-mnist-single-layer-java-app'    
          - name: model
            description: Model file generated in the previous step 'Run-dl4j-mnist-single-layer-train-model'
        parameters:
          - name: --action
            pass-as: '--action {v}'
            type: string
            default: evaluate
            description: Action to perform i.e. train or evaluate
          - name: --input-dir
            pass-as: '--input-dir {v}'
            type: string
            default: /valohai/inputs/model
            description: Input directory where the model created by the previous step can be found created
        environment: aws-eu-west-1-g2-2xlarge

Объяснение шага Сборка-dl4j-mnist-однослойное-java-приложение Из файла YAML мы видим, что мы определяем этот шаг, сначала используя образ Docker, а затем запускаем сценарий сборки для сборки uber jar. В нашем образе docker есть настройка зависимостей среды сборки (например, Graal VM JDK, Maven и т.д.) Для создания Java-приложения. Мы не указываем никаких входных данных или параметров, поскольку это этап сборки. Как только сборка будет успешной, мы хотим скопировать uberjar с именем MLPMnist-1.0.0-bin.jar (оригинальное название) к /valohai/выходам папка (представленная ${VH_OUTPUTS_DIR} ). Все, что находится в этой папке, автоматически сохраняется в хранилище вашего проекта, например, в корзине AWS S3. Наконец, мы определяем нашу работу для выполнения в среде AWS.

Примечание: Свободный уровень Валохай * у es * нет доступа к сети изнутри контейнера Docker (по умолчанию это отключено), пожалуйста, обратитесь в службу поддержки, чтобы включить эту опцию (мне пришлось сделать то же самое), иначе мы не сможем загрузить наш Maven и другие зависимости во время сборки.

Объяснение шага Run-dl4j-mnist-однослойная-модель поезда Семантика определения аналогична предыдущему шагу, за исключением того, что мы указываем два входных параметра, один для uber jar ( MLPMnist-1.0.0.jar ), а другой – для набора данных (который будет распакован в папку ${HOME}/.deeplearning4j ). Мы будем передавать два параметра --action train и --output-dir/valohai/выходы . Модель, созданная на этом шаге, собирается в папку /valohai/outputs/model (представлена ${VH_OUTPUTS_DIR}/model ).

Примечание: В полях ввода на вкладке Выполнение веб-интерфейса Valohai мы можем выбрать результаты предыдущих выполнений, используя номер выполнения, т.е. *#1* или *#2* , в дополнение к использованию URL-адресов datum://или http://. Ввод нескольких букв названия файла также помогает выполнять поиск по всему списку.

Объяснение шага Run-dl4j-mnist-однослойная-оценка-модели Опять же, этот шаг аналогичен предыдущему шагу, за исключением того, что мы будем передавать два параметра --action evaluate и --input-dir/valohai/входные данные/модель . Кроме того, мы снова указали два входа : разделы, определенные в файле YAML с именем dl4j-java-app и model без default , установленного для них обоих. Это позволит нам выбрать uberjar и модель, которую мы хотим оценить – которая была создана с помощью шага Запустите-dl4j-mnist-single-layer-train-model , используя веб-интерфейс.

Надеюсь, это объясняет шаги в приведенном выше файле определения но если вам потребуется дополнительная помощь, пожалуйста, не стесняйтесь обращаться к docs и учебные пособия .

веб-интерфейс valohai

Как только у нас появится учетная запись, мы сможем войти в систему и продолжить создание проекта с именем mlpmnist-single-layer и связать репозиторий git https://github.com/valohai/mlpmnist-dl4j-example/ в проект и сохраните проект, быстро просмотрите учебные пособия, чтобы увидеть как создать проект с помощью веб-интерфейса .

Теперь вы можете выполнить шаг и посмотреть, как он получится!

Построение DL4J Шаг приложения Java

Перейдите к Выполнения вкладка в веб-интерфейсе, либо скопируйте существующее, либо создайте новое выполнение с помощью [Создать выполнение] кнопка, все необходимые параметры по умолчанию будут заполнены, выберите шаг Build-dl4j-mnist-single-layer-java-app .

Для Окружающей среды Я бы выбрал AWS eu-west-1 g2.2xlarge и нажмите на кнопку [Создать выполнение] внизу страницы, чтобы увидеть начало выполнения.

Обучение шагу модели

Перейдите на вкладку Execution в веб-интерфейсе и выполните то же самое, что и на предыдущем шаге, и выберите Step Run-dl4j-mnist-single-layer-train-model . Вам нужно будет выбрать приложение Java (просто введите jar в поле), созданное на предыдущем шаге, набор данных уже предварительно заполнен с помощью valohai.yaml файл:

Нажмите на [Создать выполнение] чтобы начать этот шаг.

Вы увидите, как в консоли журнала промелькнет сводка модели:

    [<--- snipped --->]
    11:17:05 =========================================================================
    11:17:05 LayerName (LayerType) nIn,nOut TotalParams ParamsShape
    11:17:05 =========================================================================
    11:17:05 layer0 (DenseLayer) 784,1000 785000 W:{784,1000}, b:{1,1000}
    11:17:05 layer1 (OutputLayer) 1000,10 10010 W:{1000,10}, b:{1,10}
    11:17:05 -------------------------------------------------------------------------
    11:17:05  Total Parameters: 795010
    11:17:05  Trainable Parameters: 795010
    11:17:05  Frozen Parameters: 0
    11:17:05 =========================================================================
    [<--- snipped --->]

Созданные модели можно найти во вложенной вкладке Outputs в Выполнение главная вкладка, во время и в конце выполнения:

Возможно, вы заметили несколько артефактов во вложенной вкладке Outputs . Это потому, что мы сохраняем контрольную точку в конце каждой эпохи! Обратите внимание на это в журналах выполнения:

    [<--- snipped --->]
    11:17:14 o.d.o.l.CheckpointListener - Model checkpoint saved: epoch 0, iteration 469, path: /valohai/outputs/checkpoint_0_MultiLayerNetwork.zip
    [<--- snipped --->]

Zip-файл контрольной точки содержит состояние обучения модели на данный момент, сохраненное в трех из этих файлов:

    configuration.json
    coefficients.bin
    updaterState.bin

Обучение модели > Метаданные

Возможно, вы заметили, что эти обозначения мелькают в журналах выполнения:

    [<--- snipped --->]
    11:17:05 {"epoch": 0, "iteration": 0, "score (loss function)": 2.410047}
    11:17:07 {"epoch": 0, "iteration": 100, "score (loss function)": 0.613774}
    11:17:09 {"epoch": 0, "iteration": 200, "score (loss function)": 0.528494}
    11:17:11 {"epoch": 0, "iteration": 300, "score (loss function)": 0.400291}
    11:17:13 {"epoch": 0, "iteration": 400, "score (loss function)": 0.357800}
    11:17:14 o.d.o.l.CheckpointListener - Model checkpoint saved: epoch 0, iteration 469, path: /valohai/outputs/checkpoint_0_MultiLayerNetwork.zip
    [<--- snipped --->]

Эти обозначения запускают Valohai чтобы получить эти значения (в формате JSON) будет использоваться для построения показателей выполнения, которые можно увидеть во время и после выполнения во вложенной вкладке Метаданные в Казни главная вкладка:

Мы смогли сделать это, подключив класс listener (называемый ValohaiMetadataCreator ) к модели, так что во время обучения внимание передается этому классу listener в конце каждой итерации. В случае этого класса мы печатаем количество эпох , количество итераций , и оценка (значение функции потерь), вот фрагмент кода из класса:

        public void iterationDone(Model model, int iteration, int epoch) {
            if (printIterations <= 0)
                printIterations = 1;
            if (iteration % printIterations == 0) {
                double score = model.score();
                System.out.println(String.format(
                        "{\"epoch\": %d, \"iteration\": %d, \"score (loss function)\": %f}",
                        epoch,
                        iteration,
                        score)
                );
            }
        }

Оценка шага модели

Как только модель будет успешно создана на предыдущем шаге, мы готовы ее оценить. Мы создаем новое выполнение точно так же, как мы делали ранее, но на этот раз выбираем шаг Run-dl4j-mnist-single-layer-evaluate-model . Нам нужно будет выбрать Java-приложение ( MLPMnist-1.0.0.jar ) снова и созданную модель ( mlpmnist-single-layer.pb ) перед началом выполнения (как показано ниже):

После выбора желаемой модели в качестве входных данных нажмите на кнопку [Создать выполнение] . Это более быстрый шаг выполнения, чем предыдущий, и мы увидим следующий результат:

Показатели оценки и Матрица путаницы Анализ модели после публикации будут отображаться в журналах консоли.

Мы видим, что наша учебная деятельность привела к созданию модели, которая близка к 97% точности на основе тестового набора данных. Матрица путаницы помогает указать на случаи, когда цифра была неправильно предсказана как другая цифра. Возможно, это хорошая обратная связь для создателя модели и сопровождающего набора данных, чтобы провести некоторые дальнейшие исследования.

Остается вопрос (и он выходит за рамки этого поста) — насколько хороша модель при работе с реальными данными ?

валохайский КЛИ Его легко установить и начать работу с помощью инструмента CLI, см. Использование командной строки .

Если вы еще не клонировали репозиторий git, то вот что нужно сделать:

    $ git clone https://github.com/valohai/mlpmnist-dl4j-example/

Затем нам нужно связать наш проект Valohai, созданный через веб-интерфейс в разделе выше, с проектом, хранящимся на нашем локальном компьютере (тот, который мы только что клонировали). Для этого выполните приведенные ниже команды:

    $ cd mlpmnist-dl4j-example
    $ vh project --help   ### to see all the project-specific options we have for Valohai
    $ vh project link 

Вам будет показано что-то вроде этого:

    [  1] mlpmnist-single-layer
    ...
    Which project would you like to link with /path/to/mlpmnist-dl4j-example?
    Enter [n] to create a new project.:

Выберите 1 (или подходящий для вас вариант), и вы должны увидеть это сообщение:

    😁  Success! Linked /path/to/mlpmnist-dl4j-example to mlpmnist-single-layer.

Самый быстрый способ узнать обо всех параметрах CLI с помощью клиентского инструмента – это:

    $ vh --help

Еще одна вещь, прежде чем идти дальше, убедитесь, что ваш проект Aloha синхронизирован с последним проектом git, выполнив это:

    $ vh project fetch

(в правом верхнем углу вашего веб-интерфейса отображается значок с двумя стрелками, указывающими друг на друга).

Теперь мы можем выполнить шаги из CLI с помощью:

    $ vh exec run Build-dl4j-mnist-single-layer-java-app

Как только выполнение начнется, мы сможем проверять и контролировать его с помощью:

    $ vh exec info
    $ vh exec logs
    $ vh exec watch

Мы также можем одновременно просматривать вышеуказанные обновления через веб-интерфейс.

Дополнительные ресурсы о том, как использовать Valohai , были предоставлены в разделе Ресурсы в конце поста, есть пара сообщений в блоге о том, как использовать инструмент CLI, см. [1] | [2] .

Как вы уже видели, оба DL4J и Алкоголь по отдельности или в сочетании довольно легко начать работу. Кроме того, мы можем разрабатывать различные компоненты, составляющие наши эксперименты, т.е. среду сборки/выполнения, код и набор данных, и интегрировать их в выполнение слабо связанным образом.

Примеры шаблонов, используемые в этом посте, являются хорошим способом начать создавать более сложные проекты. Что вы можете использовать либо веб-интерфейс, либо CLI, чтобы выполнить свою работу с помощью Valohai ! С помощью CLI вы также можете интегрировать его с вашими настройками и сценариями (или даже с заданиями CRON или CI/CD).

Кроме того, ясно, что если я работаю над проектом, связанным с AI/ML/DL, мне не нужно беспокоиться о создании и обслуживании сквозного конвейера (что многим другим и мне приходилось делать в прошлом) – благодаря хорошей работе людей в Valohai .

Благодаря обоим Небесный разум (стартап, стоящий за DL4J , для создания, поддержки и сохранения свободного) и Valohai за то, что сделали этот инструмент и облачный сервис доступными как для бесплатного, так и для коммерческого использования.

Пожалуйста, дайте мне знать, если это будет полезно, написав строчку в комментариях ниже или написав в твиттере по адресу | | @theNeomatrix369 , и я также хотел бы получить обратную связь, посмотреть, как вы можете свяжитесь со мной , прежде всего, пожалуйста, ознакомьтесь с ссылками, упомянутыми выше.

Обо мне

Мани Саркар – увлеченный разработчик, в основном в области Java/JVM, в настоящее время укрепляющий команды и помогающий им ускоряться при работе с небольшими командами и стартапами, в качестве внештатного инженера-программиста/инженера по обработке данных/ml, подробнее ….

Твиттер: @theNeomatrix369 | GitHub: @neomatrix369

Оригинал: “https://dev.to/neomatrix369/how-to-do-deep-learning-for-java-3f04”