Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

AWS主催「ANGEL Dojo」へのチャレンジ & 中間発表で1位になりました!!

皆さん、こんにちは!
最近機械学習エンジニアからDevOpsエンジニアにキャリアチェンジをしつつある渡邊(@move_fastest)です。
月日が流れるのが早く、昨年3月に入社して、早くも1年が経とうとしています。

実は昨年の年末からAWSジャパン様で企画された、「ANGEL Dojo」に会社の若手を代表して参加させて頂いています!
※ANGEL は APN((AWS Partner Network)Next Generation Engineer Leaders の略

2/14(金)に中間発表を終え、ANGEL Dojoも終盤に差し迫ってきたということで、これまで取り組んできたことを振り返ってみたいと思います!

クラウド開発で日本を元気にする ANGEL Dojo

AWS様公式のHPに「ANGEL Dojo」の定義が書いてあったので引用します。

ANGEL Dojoでは次世代を担うAPNの若手のエンジニアの方々に、擬似プロジェクトを通じてアジャイル、DevOps、モダンなアプリケーション開発などのクラウドネイティブな手法と、様々なInnovationを作ってきたAmazonの文化と考え方を体験いただくことで、お客様にクラウドの価値を100%届けるための基礎的なスキルを実践を通して身につけていただきます。参加者の皆様はここで培ったスキルと、各パートナーの皆様がお持ちのそれぞれの強みを活かすことでお客様のビジネスを成功に導き、日本のITや経済をさらに成長させる主役、すなわち「APN Next Generation Engineer Leader」になっていただきます。

要するに、AWS様主催の疑似プロジェクトを通して、クラウド開発力とAmazonの文化を学び、ビジネスで日本を元気にしよう! という企画です。
IT経験1-3年以内の人が対象で、3月初旬に最終発表があります!

ちなみに、ANGEL Dojoの企画が始まるきっかけとなったのは、ある日AWSのマネージャーの方が「日本を元気にしたい!」と言い出したのがきっかけだそうです。
「日本を元気にしたい!」と思うだけではなく、それを実際に企画してしまう行動力、そしてそれを許容する柔軟な組織文化が凄いなぁと思いつつ、感謝の気持ちでいっぱいです。

↓詳しくはこちらをご覧下さい↓
「日本を元気にする」APN Next Generation Engineer Leaders(ANGEL) Dojo のご紹介


知らないことだらけの疑似プロジェクト

サービスの企画から検討するのって楽しい、けど、難しい

年明け(1/6(月))からプロジェクトがスタートし、最初の2週間は企画のフェーズでした。
"Working Backwards"(逆向き解決法)と呼ばれる、Amazonが実際にサービス企画をする際に使用するフレームワークで、お客様を起点にサービスの企画を行い、それをもとにPR(プレスリリース)を作成しました。

一からサービスを企画するのは想像していたよりもずっと難しかったです。
気づくといつも「お客様が必要としているもの」ではなく、「自分達が作りたいもの」になってしまっていました笑。
そんなとき、「自分達が企画するサービスは、本当にお客様が求めているものなのか?」 この問いに何回も立ち返り、メンバ同士で議論することで、徐々に、お客様が求めているもの(課題)やそれを解決するサービスに対する理解が深まりました。

結果として、(多くの時間を費やしたお陰もあり、)サービス内容をブラッシュアップすることができたので、非常に合理的なフレームワークだと感じました。
何を作っているかというと、みなさんの会社でも(おそらく)非効率になりがちな会議を効率化するためのサービスです。詳細は今後のお楽しみに♪

f:id:acro-engineer:20200219022002p:plain:w400
サービス企画風景

良いサービスを開発したい!

1月終盤より、企画したサービスをもとに、アーキテクチャを考え、実装に入ります。
しかし、自分達で考えたアーキテクチャ、DBスキーマ、レポジトリがナンセンスで、何度もリファクタをする羽目に・・・
普段のプロジェクトでは上司が設計してくれている部分なので、改めて無駄がなく整理されたアーキテクチャを考えてくれている上司の偉大さが身に染みました。ありがたや・・・

本当は1月中にMVP(Minimum Viable Product)を社内リリースして運用してみたかったのですが、間に合わず断念。
その後も中間発表の準備に加え、セキュリティ観点での課題も見つかり、まだ社内リリースができていません。
早く社内にリリースして実際に使ってもらいたいです。

ということで、現在も機能の作成は続けています、正直トライ&エラーの繰り返しですが、より良いサービスを作りたいという思いが強いので、とても楽しい時間です!

f:id:acro-engineer:20200219023423p:plain:w400
もくもくと実装している風景

中間発表で1位に選んで頂きました!

最終発表は3月初旬ですが、2/14(金)に中間発表がありました!
発表は午後からだったのですが、発表で使用するデモ動画、発表資料の修正を当日のランチ頃まで行っており、かなりドタバタしてしまいました。

中間発表では、全15チームが揃って発表することもあり、そこで初めて他の参加企業が作ろうとしているサービスを知ることができました。
どの企業もWorking Backwardsでお客様が日頃感じる不満から逆算した、サービス内容だったので、聞いていて素直に、「このサービス欲しいなぁ」、「このサービスが実在したら、日頃困らなくなるなぁ」と納得させられるものがほとんどでした。

私達の発表では、実際に利用してもらうシーンを想定してもらうため、作成したサービスを使用したデモ動画を紹介しました。
苦労して作成したデモ動画が好評だったこともあり、ありがたいことに中間発表では参加者投票で1位を取ることができました。
ただ、どのチームのサービスも魅力的だったので、本番発表まで残すところ2週間弱、より良いサービスを作れるよう頑張ります!

f:id:acro-engineer:20200219025513j:plain:w400
アクロ発表者(古賀)

f:id:acro-engineer:20200219025655j:plain:w400
アクロ発表者(渡邊)
f:id:acro-engineer:20200219025728j:plain:w400
中間発表見事1位

周りの方々のサポートに感謝

このチャレンジをするにあたって、多くの方々のサポートがあります。
AWS様は、週2~3回の講義、ハンズオンなど多くの企画も実施して頂いており、とても勉強になっています。また、クラウド開発のアーキテクチャやお客様視点で考えるためのコツなど、アドバイスやレビューを何度も実施してもらっており、とても助かっています。本当にありがとうございます!

さらに、この企画は1チーム5人での参加が基本となっていますが、1社で5人というのはなかなか難しく「混合チームとして参加」という案で考えていた中、「どうせやるなら5人でやった方が良い」と送り出してくれた社長・副社長には感謝です!

このように、年始から始動し、色々な方のサポートの元開発を進めているサービスなので、世の中に役立つものとして今後公開できるようにしたいと考えています!
そして、最終発表では1位になって周りで支えてくれた人に恩返しがしたいので、最終発表の3/6(金)に向けて、ラストスパートをかけていきます!
(実は、上位のチームは AWS Partner Summit Tokyo で発表する機会を頂けるので、それもモチベーションになっています)

最終発表の結果もこのブログにて報告するつもりなので、みなさん、お楽しみに!!


Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 

少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Java/PythonでモダンなWeb開発をしたいエンジニアWanted! - Wantedlywww.wantedly.com



Deep Java Library(DJL)を使ってみた

hayakawaです。
今回はJavaディープラーニングを実装できるOSSであるDeep Java Library(DJL)を使ってみました。

https://djl.ai/


ディープラーニングで何かをやるとしたら、現状ではPythonで開発するケースが多いですが、
システム全体としてはJavaで開発をしたいが、ディープラーニングの処理を利用したい場合、
これまでだと良いソリューションがなく、別サービスとしてAPI呼び出しをしたり、
JavaからPythonのプロセスを呼び出したりするようなことが必要でした。
ただこれだと、パフォーマンスが求められる場合、なかなか厳しいものがあります。

このOSSはそのようなケースで、Java上でのディープラーニング処理も実行できるようにすることを目指しているようです。

aws.amazon.com

Pythonで学習・モデル作成を行い、それをJavaで推論する、ということもできるようですが、
今回は、基本的な判定処理と学習処理を、Javaのサンプルコードから読み解いてみます。

判定処理

判定処理は、物体の種類と位置を検知する物体検知タスクのサンプルを見てみました。
プリトレーニングモデルを用いて、短いコードで判定を実現しています。

サンプル(ObjectDetetion.java)

    public static DetectedObjects predict() throws IOException, ModelException, TranslateException {
        Path imageFile = Paths.get("src/test/resources/dog_bike_car.jpg");
        BufferedImage img = BufferedImageUtils.fromFile(imageFile);

        Map<String, String> criteria = new ConcurrentHashMap<>();
        criteria.put("size", "512");
        criteria.put("backbone", "resnet50");
        criteria.put("flavor", "v1");
        criteria.put("dataset", "voc");

        try (ZooModel<BufferedImage, DetectedObjects> model =
                MxModelZoo.SSD.loadModel(criteria, new ProgressBar())) { //(1) 

            try (Predictor<BufferedImage, DetectedObjects> predictor = model.newPredictor()) { //(2)
                DetectedObjects detection = predictor.predict(img); //(3)
                saveBoundingBoxImage(img, detection);
                return detection;
            }
        }
    }
(1)モデルの読込み

モデルの読込みは

MxModelZoo.SSD.loadModel(criteria, new ProgressBar()))

というコードでやっています。

最初の MxModelZoo.SSD というところで、物体検知用のアルゴリズムであるSSDを指定し、
さらにSSDのバックボーンとなる画像判定モデルを何にするかを、
上のcriteriaというMapに詰めて指定して渡しています。
今回は"VOC"(PASCAL VOCのデータセット)で学習されたResNet50 v1のモデルを指定しています。

学習済みモデルは、名前の通りMXNet上の物がサポートされているようです。
AWSさんですし、MXNetになりますよね。

MxModelZooで指定できるモデルは以下のページに表で一覧されています。

djl/mxnet/mxnet-model-zoo at master · awslabs/djl · GitHub

表の各列の意味は次の通りです。

説明
Application 画像分類(Image Classification)やポーズ検知(Pose Estimation)などのタスクの種類。
Model Family SSDなどのモデルの分類名。この名前をMxModelZoo.~のところに指定します。
CriteriaとPossible values サンプルコードであったcriteriaに指定できる条件と値の組み合わせです。

今回やっている物体検知(Object Detection)は現在SSDのみをサポートしており、
バックボーンはVGGやMobileNetが使えるようです。

(2)判定器の生成
Predictor<BufferedImage, DetectedObjects> predictor = model.newPredictor()

で、新しい判定器を生成しています。

(3)画像の判定

メソッドの先頭の

Path imageFile = Paths.get("src/test/resources/dog_bike_car.jpg");
BufferedImage img = BufferedImageUtils.fromFile(imageFile);

で読み込んだ画像を、(2)で生成した判定器に

predictor.predict(img);

で渡し、さらに結果をsaveBoundingBoxImage()というprivateメソッドに渡して、
画像上に検知結果の名称と枠線を描画させています。

得られた画像が次のものです。

f:id:acro-engineer:20200214101006j:plain

リポジトリ内の djl/examples/src/test/resources/ ディレクトリに、
試し斬りに使える画像が置いてあるので、

Path imageFile = Paths.get("src/test/resources/dog_bike_car.jpg");

のところを書き換えて試してみましょう。

学習処理

学習の方は、伝統的なMNISTのサンプルがあったので試してみました。

サンプル(TrainMnist.java)

    public static ExampleTrainingResult runExample(String[] args)
            throws IOException, ParseException {
        Arguments arguments = Arguments.parseArgs(args);

        // Construct neural network
        Block block =
                new Mlp(
                        Mnist.IMAGE_HEIGHT * Mnist.IMAGE_WIDTH,
                        Mnist.NUM_CLASSES,
                        new int[] {128, 64}); //(1)

        try (Model model = Model.newInstance()) {
            model.setBlock(block); //(2)

            // get training and validation dataset
            RandomAccessDataset trainingSet = getDataset(Dataset.Usage.TRAIN, arguments);
            RandomAccessDataset validateSet = getDataset(Dataset.Usage.TEST, arguments); //(3)

            // setup training configuration
            DefaultTrainingConfig config = setupTrainingConfig(arguments); //(4)
            config.addTrainingListeners(
                    TrainingListener.Defaults.logging(
                            TrainMnist.class.getSimpleName(),
                            arguments.getBatchSize(),
                            (int) trainingSet.getNumIterations(),
                            (int) validateSet.getNumIterations(),
                            arguments.getOutputDir()));

            ExampleTrainingResult result;
            try (Trainer trainer = model.newTrainer(config)) { //(5)
                trainer.setMetrics(new Metrics());

                /*
                 * MNIST is 28x28 grayscale image and pre processed into 28 * 28 NDArray.
                 * 1st axis is batch axis, we can use 1 for initialization.
                 */
                Shape inputShape = new Shape(1, Mnist.IMAGE_HEIGHT * Mnist.IMAGE_WIDTH);

                // initialize trainer with proper input shape
                trainer.initialize(inputShape);

                TrainingUtils.fit( //(6)
                        trainer,
                        arguments.getEpoch(),
                        trainingSet,
                        validateSet,
                        arguments.getOutputDir(),
                        "mlp");

                result = new ExampleTrainingResult(trainer);
            }
            model.save(Paths.get(arguments.getOutputDir()), "mlp"); //(7)
            return result;
        }
    }
(1) レイヤ構造を定義

ニューラルネットワークのレイヤ構造を、MLPというクラスに生成させています。
MLPクラスのコードはこちらです。
お手軽に多層パーセプトロンを作ってくれるようです。中は次のようになっていました。

public Mlp(int width, int height) {
    add(Blocks.batchFlattenBlock(width * (long) height))
            .add(new Linear.Builder().setOutChannels(128).build())
            .add(Activation.reluBlock())
            .add(new Linear.Builder().setOutChannels(64).build())
            .add(Activation.reluBlock())
            .add(new Linear.Builder().setOutChannels(10).build());
}

width×heightの入力を受け取り、各層で128個、64個、10個の出力をする層を重ねたネットワークを構築しているようです。
層の内容を変えたければこのクラスでやっているようにadd()メソッドで積み重ねて作れます。

(2) モデルの生成

(1)のレイヤ定義を使って

try (Model model = Model.newInstance()) {
    model.setBlock(block);

で初期状態のモデルを生成しています。

(3) データの準備

getDataset()というprivateメソッドを呼び出して、MNIST用のデータを取得します。
Argument(プログラム引数)を渡しているのは、引数で指定したエポック数とバッチサイズに応じたデータ数を引っ張ってくるためのようです。

RandomAccessDataset trainingSet = getDataset(Dataset.Usage.TRAIN, arguments);
RandomAccessDataset validateSet = getDataset(Dataset.Usage.TEST, arguments);

getDataset()の内部では、 Mnist.builder() という組み込みのMNISTデータロード用クラスにデータを作らせていました。

(4) 学習の設定

setupTrainingConfig()というprivateメソッドの内部で、

return new DefaultTrainingConfig(Loss.softmaxCrossEntropyLoss())
        .addEvaluator(new Accuracy())
        .setBatchSize(arguments.getBatchSize())
        .optDevices(Device.getDevices(arguments.getMaxGpus()));

という処理で学習用の設定インスタンスを生成しています。
プログラム引数のバッチサイズや利用してよいGPU数などをセットし、Softmax関数、クロスエントロピー誤差を指定しています。

(5) 学習器の初期化

(4)で生成した環境設定で、学習器を生成しています。

Trainer trainer = model.newTrainer(config))
(6) 学習開始

学習器やデータを渡して、実際に学習を開始します。

TrainingUtils.fit(
        trainer,
        arguments.getEpoch(),
        trainingSet,
        validateSet,
        arguments.getOutputDir(),
        "mlp");
(7) モデルの保存

model.save()を呼ぶとファイルに学習済みモデルを保存できます。

model.save(Paths.get(arguments.getOutputDir()), "mlp");

感想

基本的な判定と学習を見てみましたが、APIの構成内容がオーソドックスで名前にクセも無いため、
他のディープラーニングフレームワークを知っていれば習得は速そうです。

またGPUは勝手に見つけて勝手に使ってくれるらしく楽です。

OpenCVなどを用いる画像処理ライブラリは、DJL側でラッパーを用意しており、
基本的な操作であれば独自にOpenCVを触らないでよさそうです。

上で紹介した以外のサンプルも同じディレクトリに配置されており、
基本的にはサンプルを真似して使えば一通りのことはできそうだと感じました。
Java上のディープラーニングライブラリとしては、良い候補になりそうです。

Acroquest Technologyでは、キャリア採用を行っています。


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

機械学習未経験者も良いモデルを作れるAutoGluonで「テキスト分類」をやってみた

こんにちは。@Ssk1029Takashiです。

最近、タスクを設定して、データセットを与えれば勝手にモデルまでいい感じにしてくれるAutoMLを使うための様々なサービス・ライブラリが出てきています。
先輩の@tereka114がAutoGluonを使っているのをみて触発されたので、私のほうではテキスト分類をやってみました。
acro-engineer.hatenablog.com

今回は、MXNetを使用したAutoMLライブラリであるAutoGluonを使って、テキスト分類を試してみます。

今回試した環境

python:3.7.6
OS:Ubuntu 18.04 LTS
ハード:GCP Compute Engine、メモリ 16GB、GPU NVIDIA Tesla K80

CUDA&AutoGluonのインストール

今回はGPU環境へのインストールを試していきます。
GPUを使うためので、CUDAのインストールが必須になります。

CUDA10.0のインストール

基本的には下記のGCPのページにそってインストールします。
cloud.google.com

最後のCUDAのインストールのコマンドを以下のように変更します。
(サイトの手順の場合、最新版がインストールされるのですが、今回使用するMXNetが10.0に対応しているのでこちらを合わせます。)

sudo apt install cuda-10-0

AutoGluonのインストール

下記のサイトにある通り、pip install2行でインストールできます。
導入が楽なのはありがたいですね。
autogluon.mxnet.io

pip install --upgrade mxnet-cu100
pip install autogluon

※現在はpython3.6と3.7、OSはLinuxのみの対応となっています。

AutoGluonでテキスト分類を行ってみる

それでは、チュートリアルにある通り、テキストの分類を試してみます。
今のところAutoGluonではStanford Sentiment Treebankデータセットでのベンチマークを試せます。

import autogluon as ag
from autogluon import TextClassification as task

dataset = task.Dataset(name='ToySST')
predictor = task.fit(dataset, epochs=3)

datasetを指定して、fitメソッドを呼び出すだけで、学習を始められます。
fitメソッドで指定しているepochsは学習方法を変化させるまでに実行するトレーニング回数になります。

学習を開始すると、以下のように自動でモデルがダウンロードされて学習を始めます。
f:id:acro-engineer:20200122004657p:plain

AutoGluonのTextClassificationでは、デフォルトの場合、 Gluonで使用できるBERTの英語pretrainedモデルを使用して学習を進めるようです。
そして、一つのモデルについて指定したepoch数の学習が完了すると、違うモデルで学習を始めて、より良いモデルを探索します。
f:id:acro-engineer:20200122013656p:plain

また、predictメソッドやevaluateメソッドから、学習した中で最も精度が良かったモデルを使って、推論・評価することが可能です。

test_acc = predictor.evaluate(dataset)
print('Top-1 test acc: %.3f' % test_acc)

結果は以下のように出力されます。

Top-1 test acc: 0.868

このデータセットの研究での精度は89%~97%程度となっています
nlpprogress.com
今回試した精度は86.8%でしたが、epoch数が3の学習で手軽にここまで迫れるの良い結果なのではないかと思います。

使ってみての感想

テキストに関しては、まだパラメータチューニングの対象・範囲の指定しかできませんが、カスタムデータセットへの対応がされると、適用できる範囲も広がるように思います。
また、現状では対応しているモデルも、BERTの英語モデルに限られているようですが、テキスト分類を簡単に高精度で実施できるのはうれしいので、これから拡張されていくことを期待しています!
(個人的には、日本語のpretrainedモデルに対応してくれると嬉しいです)

まとめ

今回はAutoGluonを使って、AutoML+テキスト分類を簡単に試しました。
インストールから使い始めまで、非常に容易にAutoMLを試すことができました。
これから機能が拡張されれば、より便利で手軽に機械学習を試せるようになりそうです。
引き続き今後の拡張を追っていきたいと思います。
それではまた。

Acroquest Technologyでは、キャリア採用を行っています。


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

機械学習未経験者も良いモデルを作れるAutoGluonで「テーブルデータの解析」をやってみた

こんにちは。
@tereka114です。

最近はCA x atma杯に参加するなどバタバタしておりましたが、少しずつ落ち着いてきました。
今回、AutoGluonと呼ばれるツールを使ってテーブルデータに挑戦してみました。

AutoGluonについて

AutoGluonは簡単に拡張、利用ができる自動機械学習のライブラリです。
前処理、ハイパーパラメータのチューニング、モデル選定、或いはアンサンブルといった機械学習モデリングを自動化できます。
これにより、機械学習に詳しくない人も簡単に精度が高いモデルの作成ができます。

autogluon.mxnet.io

AutoGluonはテーブルデータの分類・回帰、画像分類、文書分類、物体検出、そして、ニューラルネットワークアーキテクチャの自動構成を行うNAS(=Neural Architecture Search)に対応しています。
今回は、テーブルデータの分類を行うモデルを自動構築し、最適なモデルを提供します。

画像分類やテキスト分類と比較してテーブルデータの分類・回帰の自動化は難しいです。
テーブルデータは列に様々な情報が含まれるため、入力データごとに別々の特徴量変換手法を試す必要があります。
たとえば、温度や湿度のように数値で表現できるものは加工しなくとも数値のまま扱えます。
しかし、文字列であれば、その文字を数字に変換するなど工夫が必要になります。

これらの方法を知らなくても、AutoGluonが自動でその工夫を行ってくれるため、実装者はデータに対して何も加工することなく、機械学習モデルの作成ができます。

AutoGluonでテーブルデータの解析に挑戦する

今回、テーブルデータのサンプルには、機械学習チュートリアルで頻繁に利用されるTitanicのデータを利用します。
このデータセットを事前にKaggleのサイトに登録し、入手してください。

www.kaggle.com

1. データを読み込む

はじめに、学習用のデータを準備して、AutoGluonで利用できる形式にします。
autogluon.TabularPrediction.Datasetクラスを利用します。そのクラスの引数にファイルパスを入力し、インスタンスを初期化します。

import autogluon as ag
from autogluon import TabularPrediction as task

train_data = task.Dataset(file_path='train.csv')
2. 学習を行う

次に学習を行います。学習の実装は次の通りです。
autogluon.TabularPrediction.fitにより、あとは何も考えず、よしなに実行されます。

output_directory = "./outputs"
label_column = "Survived"
predictor = task.fit(train_data=train_data, label=label_column, output_directory=output_directory)

学習データとラベルと結果出力先のディレクトリを指定します。
それぞれ、デフォルトで決まっているモデルを利用し、構築します。
ディレクトリには、学習された結果のモデルが出力されています。

学習を開始するとログが次の通り、出力されます。
解析するデータセットの情報や使っている機械学習アルゴリズムとその評価結果、そして学習時間が出力されます。
単体のモデルだと、LightGBMの精度が最も高く、複数の機械学習アルゴリズムのアンサンブルでより精度が向上していることがわかります。

Loaded data from: train.csv | Columns = 12 / 12 | Rows = 891 -> 891
Warning: Specified num_trials == 1 or time_limits is too small for hyperparameter_tune, setting to False.
Beginning AutoGluon training ... Time limit = 10s
Preprocessing data ...
Here are the first 10 unique label values in your data:  [0 1]
AutoGluon infers your prediction problem is: binary  (because only two unique label-values observed)
If this is wrong, please specify `problem_type` argument in fit() instead (You may specify problem_type as one of: ['binary', 'multiclass', 'regression'])

Selected class <--> label mapping:  class 1 = True, class 0 = False
        Data preprocessing and feature engineering runtime = 0.33s ...
AutoGluon will gauge predictive performance using evaluation metric: accuracy
To change this, specify the eval_metric argument of fit()
Fitting model: RandomForestClassifierGini ... Training model for up to 9.67s of the 9.67s of remaining time.
        0.29s    = Training runtime
        0.8212   = Validation accuracy score
Fitting model: RandomForestClassifierEntr ... Training model for up to 9.19s of the 9.19s of remaining time.
        0.28s    = Training runtime
        0.8156   = Validation accuracy score
Fitting model: ExtraTreesClassifierGini ... Training model for up to 8.64s of the 8.64s of remaining time.
        0.27s    = Training runtime
        0.7933   = Validation accuracy score
Fitting model: ExtraTreesClassifierEntr ... Training model for up to 8.06s of the 8.06s of remaining time.
        0.27s    = Training runtime
        0.7821   = Validation accuracy score
Fitting model: KNeighborsClassifierUnif ... Training model for up to 7.61s of the 7.61s of remaining time.
        0.03s    = Training runtime
        0.6089   = Validation accuracy score
Fitting model: KNeighborsClassifierDist ... Training model for up to 7.48s of the 7.48s of remaining time.
        0.01s    = Training runtime
        0.6145   = Validation accuracy score
Fitting model: LightGBMClassifier ... Training model for up to 7.36s of the 7.36s of remaining time.
        0.28s    = Training runtime
        0.8268   = Validation accuracy score
Fitting model: CatboostClassifier ... Training model for up to 7.06s of the 7.06s of remaining time.
        0.66s    = Training runtime
        0.8156   = Validation accuracy score
Fitting model: NeuralNetClassifier ... Training model for up to 6.39s of the 6.39s of remaining time.
        3.54s    = Training runtime
        0.7933   = Validation accuracy score
Fitting model: LightGBMClassifierCustom ... Training model for up to 2.59s of the 2.59s of remaining time.
        0.4s     = Training runtime
        0.8268   = Validation accuracy score
Fitting model: weighted_ensemble_l1 ...
        0.36s    = Training runtime
        0.8492   = Validation accuracy score
AutoGluon training complete, total runtime = 9.52s ..

また、各モデルのハイパーパラメータをチューニングする場合には、hyperparameter_tuneの引数にTrueを与えます。
例えば、次のように設定できます。

predictor = task.fit(train_data=train_data, label=label_column, output_directory=output_directory, hyperparameter_tune=True, num_trials=10, time_limits=10)
3. 推論を行う

推論もごくわずかな実装で可能です。
学習した結果の機械学習モデルを利用して推論します。

test_data = task.Dataset(file_path='test.csv')
y_pred = predictor.predict(test_data)

使ってみての感想

良かったところ

機械学習そのものを知らない人でも簡単に記述できる

今回実施した通り、非常にシンプルに実装を書けます。
更には特に人間が設定しなくてはならないハイパーパラメータの設定を行っていません。
それぞれのモデルの知見が少なくともそれなりのスコアを出せることが良い点です。

ハイパーパラメータのチューニングも可能

fit関数は標準の引数だと、実行モデルの標準パラメータを網羅するのみとなっており、ハイパーパラメータの調整までは行いません。
しかし、ハイパーパラメータのチューニングの有無を指定でき、時間をかければ、より高い精度を出せます。
ハイパーパラメータの試行回数も設定ができるので、巨大なデータの場合は少ない回数を指定できるなど、設定の工夫が可能です。

制限時間がついている

一度の検証の制限時間を引数として与えられます。
そのため、偶然にも極端に長い検証時間がかかるハイパーパラメータを引き当ててしまった場合、通常だと終わるまで待つか、実行そのものをキャンセルするかになります。
この設定により、時間で打ち切り、すぐに次の試行に移れます。

ここがあるとより嬉しい

ドキュメントや例の整備

例題は非常にシンプルで使いやすいと思っていますが、カスタマイズする際にどうすればよいのかがあまり書かれていないと感じました。
ここに書いてあるかなーとメソッドのリファレンスを参照し、実行することで理解ができました。
機械学習をメインに取り組んでいる人であれば、直感と閃きで発見することが可能でしたが、なれていない人では難しいと思います。

最後に

AutoGluonですが、想像よりも柔軟に様々なパラメータを設定できてよいツールだと感じています。
ちょっとした実験や分析には十分利用できるライブラリだと思っています。
では、またお会いしましょう!

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

関東CV勉強会第56回で発表してきました

皆さんこんにちは。
お元気ですか。@tereka114です。
年始にお布団を家に購入して、冬でも想像以上に快適な眠りを迎えられています。

早速本題ですが、1/19(日)に関東CV勉強会第56回に参加し、発表してきました。

今回の勉強会のテーマは「コンピュータビジョンでこんなプログラム作りました大LT大会」です。

エッジデバイスとDeepLearningを組み合わせたもの・OpenCVのライブラリを使ったソフトウェア・自社製品等様々な発表がありました。
どの発表も創意工夫がされており、新しい発見も多く、非常に有意義でした。

今回はそのLTで「Mixed Precisionのすゝめ」のタイトルで発表しました。
Mixed Precisionはfloat32/16を利用して、計算精度を維持しつつも、メモリ消費量、性能の向上を実現する技術です。
それらはAutomatic Mixed Precision(AMP)と呼ばれるNVIDIA社提供のライブラリで簡単に使えます。

www.slideshare.net

発表内容の詳細は、スライドをご確認ください。
このAMPを自分のモデルをより良くする一つの選択肢として考えていただければ幸いです。

では、またどこかでお会いましょう。

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

2019年アドベントカレンダー振り返り

皆さんこんにちは
@tereka114です。

皆さん、今年もアドベントカレンダーが盛り上がりましたね。皆さんはどのアドベントカレンダーが良かったでしょうか?

Acroquestは、今年も有志がQiitaの各種アドベントカレンダーに参加し、執筆していました。
本記事ではアドベントカレンダーの投稿記事の一覧と注目度の高かった記事を紹介します。

おすすめ3記事

GiNZA+Elasticsearchで係り受け検索の第一歩

acro-engineer.hatenablog.com

検索といえば、キーワード検索や全文検索といった言葉が思い浮かぶ人が多いと思います。
しかし、症例検索の場合には、単語は含まれるが、検索としては絞りたいといったケースがあります。例えば、次の通りです。
「ずっと胃がキリキリと痛い。ただ、熱は無く平熱のままだ。」
「昨日からとても頭が痛い。おまけに胃がむかむかする。」

「胃が痛い」と検索したとき、通常の単語検索の場合だとどちらもヒットしますが、下の文章は意味としては異なる文章のためゴミになります。
この課題に対し、自然言語処理ライブラリGiNZAを利用して係り受けの情報を考慮した検索に挑戦しました。

私自身、検索だと、特に画像のベクトル検索の経験があります。
係り受けの情報を利用するのは自然言語ならではの取り組みで、アイデアが面白いと感じました。

Micrometerで取得したデータをKibanaで可視化してみました

acro-engineer.hatenablog.com

Spring Bootのアプリケーションの監視に使われるMicrometerを使ってKibanaで可視化しました。
これまでは、KibanaにMicrometerのメトリクスを監視するダッシュボードがなく、Prometeus&Grafanaが選ばれていました。
そのため、この記事では、ダッシュボードを作成し、可視化しました。

更にElastic Stackの一つであるElastic APMとも組み合わせたデモを作っています。
これにより、Spring Bootの状況をKibanaで一覧化できます。
そのため、性能のボトルネックとなる箇所やリクエストの処理情報が見えます。

当社のGithubに公開されているので、ぜひ使ってみてください。

1. Micrometer Kibana Dashboard
github.com

2. Micrometer & Elastic APM Demo
github.com

実務で使えるニューラルネットワークの最適化手法

acro-engineer.hatenablog.com

私が記載した記事になります。ニューラルネットワークの最適化手法(Adamなど)は毎年のように発表されています。
それらの最適化手法はどの手法を選ぶべきかに加えて、ハイパーパラメータチューニングをどうすべきかを検討する必要があります。
今まできちんと検証する機会もなかったので、これを機に、CIFAR10で検証を行いました。

最後に

2019年も終わりが近づいてきています。
今年のブログを振り返ってみると、特にElasticsearchや機械学習の記事が多い感じがします。
来年も引き続き、皆さんに良い情報を提供していきたいと思っています!

では、また来年もよろしくお願いします。

Acroquest Technologyでは、キャリア採用を行っています。


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

モノリシックなアプリケーションをマイクロサービス化したいエンジニア募集! - Acroquest Technology株式会社のWeb エンジニアの求人 - Wantedlywww.wantedly.com

令和時代のサーチエンジンになるか? 気鋭のベクトル検索OSS Milvus についてまとめてみた

はじめに

情報検索・検索エンジン Advent Calendar 2019 24日目の記事です。
担当は@yktm31です。 

本記事ではMilvusという大規模ベクトル類似度検索エンジンについて紹介したいと思います。
一般的な検索は所謂、単語を使って検索するような方式ですが、近しいベクトルの計算によって
画像から画像を検索する、テキストから画像を検索するようなことにも応用ができます。
Milvusはそのような用途に適切なライブラリです。

zillizという上海のベンチャー企業が開発していて、2019年11月5日にOSS化されました。
たまたまGitHubのTrendingで見つけ興味を持ったのですが、なんにせよ公開から日が浅く、情報が少ないです。
2019年12月現在、手がかりとなる有力なソースは主に3つです。
 1. 公式webサイト
 2. GitHubリポジトリ
 3. medium

本記事では、そんなMilvusについてわかったことまとめていきたいと思います。

Milvus

ベクトル類似度検索

高速ベクトル検索OSSとしては、既にいくつか有名どころがあります。
それらと比べたときに、Milvusがどういったポジションにいるのか見ていきます。

まずは、既存の有名どころを簡単に整理しておきます。

faiss

・FAIRが開発
GPU対応
日本語参考記事

SPTAG

Microsoftが開発
・Bingで用いている最近傍探索ライブラリがOSS化したもの
日本語参考記事

annoy

Spotifyが開発
・Approximate Nearest Neighbors Oh Yeahの略
・プロセス間でインデックスを共有可能
日本語参考記事


では、Milvusはどういった特徴を持っているのでしょうか。
公式ドキュメントの中で、faiss・SPTAGとMilvusの比較がされています。

f:id:acro-engineer:20191226013323p:plain

こちらのブログを要約すると、Milvusが目指しているのは「音声・画像/映像・テキストといった、非構造化データをシンプルかつスケーラブルに扱える検索エンジン」ということになりそうです。
企業が持つデータが多様化するなか、検索エンジンとしても多様なデータを扱えるようにならないとね、
ということだと思いました。

機能としても、単に計算ライブラリとしてではなく、デプロイ・運用・監視を見据えたアプリケーションという側面が強くでていると思います。

Milvusの特徴

Milvusの目指すところが掴めたところで、次にMilvusの特徴について具体的に見ていきます。

公式が出しているKey Featuresの中からいくつかピックアップしてみます。

・Heterogeneous computing
つまるところ、様々なコンピュータアーキテクチャ上で動作すると言うことみたいです。
現状では、 x86/GPU/ARMに対応しています。
ゆくゆくは、TPU や ASICにも対応する予定があるそうです。

・Multiple indexes
quantization, tree系, graph探索系に対応しています。
データ規模や、ハードウェアスペックに合わせて選択することができます。

・Visualized monitor
Prometheus/Grafanaを利用した、パフォーマンス監視・アラート通知に対応しているそうです。
ドキュメントに、立ち上げ方の手順が載っています。

Milvusの使い所

実際にアプリケーション・プロダクトとしてどう使えるのか、気になるところかと思います。

結論から言うと、まだ実運用を想定した事例について情報を集めることは難しそうです。

サンプルとしては、実装面ではサンプルコードが、利用面では三つのユースケースが提供されています。

紹介されているユースケースは、以下の三つです。
 ①パーソナルレコメンド
 ②マルチモーダル検索
 ③重複動画の削除

ただ、あくまでシナリオとしての紹介で詳細については述べられていません。
この辺は実際に触ってみて、知見を蓄積・共有していくことが必要なのだと思いました。

Milvusの動かし方

最後に、Milvusを実際に動かしてみます。
具体的には、Dockerコンテナを立ち上げ、Python用のSDKでサンプルコードを動かします。

実行環境は以下の通りです。

OS Ubuntu18.04
GPU 1080ti
python 3.7.5
docker 19.03
nvidia-driver 418

まず、MilvusのDockerコンテナを立てます。
公式からイメージが提供されているので、簡単に立ち上げることができます。

$ docker pull milvusdb/milvus:latest

# Milvusの設定ファイルをダウンロードする。
$ mkdir -p /home/$USER/milvus/conf
$ cd home/$USER/milvus/conf
$ wget https://raw.githubusercontent.com/milvus-io/docs/master/assets/config/server_config.yaml
$ wget https://raw.githubusercontent.com/milvus-io/docs/master/assets/config/log_config.conf

# Milvusを起動する。
$ docker run -d --name milvus_gpu --gpus all -e "TZ=Asia/Tokyo" -p 19530:19530 -p 8080:8080 -v /home/$USER/milvus/db:/var/lib/milvus/db -v /home/$USER/milvus/conf:/var/lib/milvus/conf -v /home/$USER/milvus/logs:/var/lib/milvus/logs milvusdb/milvus:latest


次に、Python SDKをインストールし、サンプルコードを実行します。

# Milvus Python SDKのインストール
$ pip3 install pymilvus==0.2.6

# サンプルコードのダウンロード
$ wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/example.py

# サンプルコードの実行
$ python3 example.py

正しく動作すれば、最後に Query result is correct. と出ます。


example.pyの中身としては、以下のような処理が走っています。
①Milvusコンテナに接続
②テーブル作成
③16次元 10000ベクトルデータを投入
④Index (IVFLAT)の作成
⑤サーチを実施
⑥サーチ結果の確認
⑦テーブル削除とコネクション切断

ソースにはコメントも入っていて、Milvusの基本的なオペレーションを理解することができました。

まとめ

本記事では、Milvusという公開されて間もないベクトル検索エンジンについて、公開情報を基にまとめて見ました。
しかし、実際の実装や構築周りについては、サンプルを動かした程度までなので、
手元で動かしてみた結果を別の記事としてまとめたいと思います。


また今回、類似度検索で使われる詳細なアルゴリズムに関しては触れてきませんでした。
そのあたりについては、松井勇佑さんの資料がわかりやすかったので、参考として挙げさせていただきます。
近似最近傍探索の最前線
billion-scaleの近似最近傍探索


まだまだ事例も情報も少ないMilvusですが、今後どうなっていくのか引継ぎウォッチングしたいと思います。
次は実装を積んで、利用感などをまとめていきます。

最後までありがとうございました。
それでは、よいお年を!

Acroquest Technologyでは、キャリア採用を行っています。


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

データを活用し社会を進化させたい機械学習エンジニアWanted!! - Acroquest Technology株式会社のエンジニアの求人 - Wantedlywww.wantedly.com