Furyu
[フリュー公式]

Tech Blog

フリュー株式会社の技術ブログです

2018年03月27日

CentOS7でのSpring Bootの起動について

こんにちは。フリューのジョンです。

さてさて、以前以下の記事でSpring Bootアプリケーションのserviceでの起動について触れました。
Spring Boot アプリケーションの再起動時にハマったこと

しかし、上記はCentOS6での話でした。CentOS7になるとより柔軟なサービスの管理ができます。
さて、何が変わるのでしょうか?

serviceとsystemctlの違い

私が感じている良い点としては以下です

  1. systemctl statusでサービスの状態がわかる(いつ起動したのかなどもわかります)
  2. 後述する、ユニットファイルの設定によって起動の依存を記述することができる(あるサービスが起動していなければ動かさないなど
  3. 起動時、停止時に呼ばれるスクリプトを指定することができる

実際に複雑なマイクロサービスを作っていく上では欲しい機能になるかと思います。

変更方法

主に前回のものとの比較になりますが2点が異なるのみです。

サービスの登録方法がことなる

サービスの登録には以下のコマンドを実行していましたが

CentOS7では、プロセス名.service というユニットファイルを /usr/lib/systemd/system に配置します。
中身は以下のようになります。(中身の詳細は 9.6. システムのユニットファイルの作成および変更 を参照ください)

プロセスの起動方法が異なる

サービスの実行には以下コマンドで実行していましたが、

CentOS7では、systemctlコマンドを利用します。

この2点だけです。それ以外のconfファイルの書き方、配置などは全く変わりません。

補足

デフォルトのユニットファイル設定では /var/log/messages にログが吐き出されます。
そのため、アプリケーションのログは別に出しているし、ここに吐き出されたくない場合はユニットファイルのServiceに以下を追加します。

まとめ

systemctlコマンドによる起動で再起動スクリプトを自作する必要もありません(serviceによる起動でも同じですが
マイクロサービスを進めていくには、インフラ回りについてきちんと勉強していく必要があると感じます。

それでは素敵なマイクロサービス運用、Spring Bootライフを!!

弊社では一緒にサービスを作ってくれるSpringエンジニアを募集しています!!

詳しくはこちら


2018年03月16日

富士谷 康

CycleGANでプリ画と逆プリ作ってみた

はじめまして。ガールズ総合研究所リサーチ部システム課の富士谷です。まだギリギリ新卒2年目です。
普段は、プリントシール(以下、プリ)機のビジネスに関わる情報収集システムの構築・運用をしています。
日夜、GIRLSをHAPPYにするにはどうするかを考えていて、たまに、画像処理関係の情報収集を行っています。
ちなみに、女子高生ミスコンの平均顔を作成する実装には私が関わりました。

さて、社内では、主にエンジニアが技術について発表する「技術交流会」というイベントがあるのですが、
そこで話した内容を抜粋し、プリ機の処理を真似られるか、CycleGANを使って試してみた話をご紹介したいと思います。

はじめに

プリといえば、何と言っても、その画像処理ですよね。
この画像処理の目的を端的に言えば、「画像の顔などを加工することにより、本人にとってより”好ましい”画像(いわゆる「盛れてる」画像)への変換を行うこと」と言えるのではないかと思っています。
画風変換に近いとも言えそうですが、個々人の感性に合う必要があるというのが難しいところですね。

さて、最近のディープラーニング、特に、GAN(Generative Adversarial Network)を使った画像生成は、ときには人を騙せるくらい、高精度に行えるようになってきています。
例えば、個人的に気になってるのは次のような技術です。

PGGAN (日本語での報道「どこかにいそうなセレブ」の顔、AIで生成– NVIDIAが実現
Bringing Portraits to Life

GANを使えば、プリの画像も生成(模倣)できる可能性があります。
もし、ディープラーニングを使ってプリの画像処理を真似することができれば、プリ機で利用している画像処理の要素要素に、色々と応用が効きそうですね。

 CycleGAN

CycleGANは、2017年に公開された、画像を異なる画像に”変換”(Translation)する手法です。

この手法より少し前に公開されたpix2pixと合わせて、pytorchによる実装も公開されていて、今回はこれを利用しました。
pytorch-CycleGAN-and-pix2pix

手法の詳細な解説は他に譲りますが、CycleGANの応用例は、プロジェクトサイトでも紹介されていて、「試してみた」レポートは日本語でもいくつかあります。

プリの場合、変換元と変換先で対応付けて画像を作成できるため、pix2pixでも良かったのですが、デフォルトのパラメータで簡単に試した限りでは、あまり精度が良くなかったためCycleGANを利用しました。

ニセプリと逆プリを作る

CycleGANを使って、プリ機の加工と、プリ画から元の画像(原画)への変換を学習してみたいと思います。
CycleGANで原画から生成したプリ画(fakeなプリ画)を「ニセプリ」、プリ画から生成した原画(fakeな原画)を「逆プリ」と呼ぼうと思います。

もしも、ニセプリをうまく生成することができれば、データセット次第ではあるものの、プリ画の作成に機械学習が役立つでしょう。
もしも、逆プリがうまくできれば、例えば、「化粧シミュレーター」アプリで、撮影者がしている化粧をキャンセルし、より自然な化粧をした画像の作成に役立つのではないかと思っています。

CycleGANを利用するにあたり、まずは、データセットを作ります。
画像に落書きや背景のコンテンツがあるとうまく学習できない可能性があるため、落書きなし・背景なしのプリ画を作成します。
プリ機の開発に利用するために許諾を得た約2500枚程度の原画を元に、あるプリ機の処理を使って落書きなし・背景なしのプリ画を作成しました。

また、プリと言えば顔の加工ですよね。まずはこの、顔の加工が学習できるのか見るために、
プリ画から顔のみを個別に切り出し、回転・縮小拡大により、顔の大きさと位置を整えた、原画とプリ画を約4000組準備しました。
これを元に、CycleGANで学習させて、別に撮影したモデル画像をテスト画像として、原画からプリ画を生成してみました。
今回は、その中から、公開について特別に許諾を得た、1人の画像をご紹介したいと思います。(ご協力ありがとうございます!)

その結果は以下のとおりです。

demo2_in_A2_0_real_B demo2_in_A2_0_fake_B
片方は本物の原画から本物のプリの処理を使って作成したプリ画です。
もう片方は、本物の原画からCycleGANによって生成したニセプリです。
みなさんどっちがニセプリかわかりますか?

正解は、向かって左側が本物、右側がニセプリです。

CycleGANでは、原画→プリ画のニセプリ変換だけではなく、プリ画→原画の変換(逆プリ)も同時に学習できるので、これも試してみました。

結果は次のとおりです。

demo2_in_A2_0_real_A  demo2_in_A2_0_fake_A

向かって左側が本物、右側が逆プリです。

わかりにくいのでGIFにしました。(変換により画像は粗めです)

demo2_in_A2

こうやってみると、質感・色味・明るさ変換・変形、背景切り出し等々、プリの様々な加工を学習していますが、プリほど高精度にはできてないことがわかります。
特に、ニセプリの方は若干変形が甘く、ややぼやけた画像になってしまっています。
(変形にはおそらくLossのL1距離が効いているように思うのですが、あまり実験できていません)

「ニセプリで女子高生を騙せるのか」といったような定量的な計測はできていませんが、社内の女性に聞いてみたところ、どっちが本物でどっちが偽物かがわかるようです。
「かなりいい線いってる」と私は思っていましたが、やはり見る人が見ればわかるようで、まだまだ、GANのDiscriminatorより、人のほうが精度高いようですね。

一方、逆プリは、変形で戻しきれておらず、また、肌が復元できていないようで、のっぺりした印象を持ちます。
とはいえ、ある程度自然な?逆プリが作れているのではないかと思います(データセットに含まれるプリ機限定ですが)。

まとめ

CycleGANでは、馬をシマウマにするのは容易で、犬を猫にするのは変形が必要なため苦手だと言われますが、学習途中の画像を見ると、この程度の変形であれば、じわじわ学習していくようです(結構驚きでした)。
精度や画像サイズ(画素数)の課題により、プリ機へのCycleGANの直接的な応用は難しそうですが、今後のディープラーニングの発展にも期待できる結果ではないかと思っています。
ディープラーニングに限らず新たな技術を上手く活用することで、女性の多様化・高度化する好みに応えられるのではないかと考えているので、GIRLSをHAPPYにするための情報収集や実装は今後も全力でやっていきたいです。

最後に

弊社では、プリに関わりたい方、スマホアプリを作りたいという方、女性をHAPPYにするため技術力を発揮したい方を募集しています。
詳細は以下のページを御覧ください。

 

※ 会社名、製品名、サービス名等は、それぞれ各社の商標または登録商標です。


2018年03月8日

Spring Boot アプリケーションの再起動時にハマったこと

こんにちは。フリューのジョンです。

Spring Boot良いですよね。設定が楽ですね。弊社ではマイクロサービスを勧めていく上でSpring Bootを使うことが増えてきました。

ただ、Spring Bootのアプリケーションを再起動する際にkillをしても、たまにプロセスが死なない時があり、再起動に失敗するということがありました。

何かいい方法はないのかなぁと見ていたところ以下が見つかりました。
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
この方法を入れると今までは

という感じで起動していましたが

で起動するようになります。startの他には以下があります

  • stop
  • force-stop
  • restart
  • force-reload
  • status
  • run

この方法で起動するには前準備が必要です。

 

前準備

mavenプロジェクトであればpom.xmlに以下pluginを追加します

次にconfファイルを作成します。ファイル名はjarの名前と同じにしておきます。${application}.conf(confファイルは環境変数に設定してある場合は無くても良いです

次にpackagingしたjarファイルをサーバにデプロイし、権限を変えておきます。

配置したjarと同じ場所に先ほど作成したconfファイルを配置し、その後以下でリンクを作成します。

これで終わりです。

 

再起動方法

jarファイルをデプロイした後に、以下コマンドで再起動をしていくことになると思います。

 

なぜ動くのか

mavenのpluginを入れることでjarファイルの先頭にスクリプトが挿入されます。
このスクリプトがserviceからの起動に対して動くことになります。

参考: Spring Boot の Fully Executable Jar はなぜ動くのか

 

application.ymlに書いた日本語文字列が文字化けする

起動はできたのですが、application.ymlに書いた文字列が文字化けしてしまいました。

そこで先ほど記載したconfのJAVA_OPTSにfile.encodingを追加します。

 

まとめ

以上の設定をすることで今までのところ再起動失敗というのはなくなりました。

素敵なマイクロサービス運用、Spring Bootライフを!!

弊社では一緒にサービスを作ってくれるSpringエンジニアを募集しています!!

詳しくはこちら

 


2018年03月7日

Kayo

Pacemaker+Corosyncを使ってみました!(インストール編)

みなさん、こんにちは。コンテンツ・メディア第1事業部インフラ課の藤本佳世です。
今回は、Pacemaker+Corosyncについてお話しします。
今までは、Heartbeatを使っていたのですが、サーバリプレースに伴い、最新バージョンで推奨されているPacemaker+Corosyncを構築しました。まずは、インストールの部分をお話ししたいと思います。

Pacemakerとは

オープンソースソフトウェアとして開発されている、HAクラスタソフトのこと(Heartbeat の後継)。
障害を検知したら他のサーバに自動的にフェイルオーバしてくれます。
Corosyncと組み合わせて利用します。
※HAとは、「High Availability」高可用性のこと。

Corosyncとは

ノードの死活監視を行うオープンソースソフトウェア。
Pacemakerと組み合わせて、クラスタシステムを構成します。

フリューでの利用について

主に、データベースサーバでPacemaker+Corosyncを採用しています。
サーバ(master)に仮想VIPがセカンダリIPとして割り当てられており、サーバ(master)に障害が発生した際、10秒以内(弊社環境)でサーバ(slave)に仮想VIPが付与され、masterとして稼働します。
以前のHeartbeatよりも、Corosyncの方が切替の時間が早いというメリットもあります。

構築した環境

サーバ名 OS Pacemakerバージョン Corosyncバージョン IPアドレス 仮想VIP
server1 CentOS7.4 1.1.16.1 2.4.2-1 192.168.33.28 192.168.33.21
server2 CentOS7.4 1.1.16.1 2.4.2-1 192.168.33.29

Pacemaker+Corosyncの構築

LINUX-HA JAPANのドキュメントを参考に進めました。
詳しく手順が書かれているので、この通りに進めるだけです。

インストールの後は、corosync.confを修正します。

以下のbindnetaddrとquorumの部分を修正しました。

  • bindnetaddr:構築するネットワーク環境に合わせて設定
  • expected_votes :クラスタを構成するノードの数を設定

続いて、corosync認証鍵ファイルの設定です。
どれか一つのノード上で実行します。

/etc/corosync配下にauthkey ファイルが生成されます。
作成されたauthkeyファイルをクラスタを構成する全てのノードにコピーします。

この後は、pacemakerファイルの設定です。
pacemakerの内部プロセスが故障した場合も、ノード故障として取り扱うようにするため、
以下の設定に変更します。

そして、最後にクラスタ起動スクリプトの設定です。
ドキュメントに下記の設定を反映させるために修正が必要と書かれています。

  • pacemakerサービス停止時に corosyncサービスも同時に停止させるため
  • corosyncプロセス故障時に watchdog 機能を有効にするため
  • corosyncの改善により soft_margin オプションは不要となったため

※ExecStart/Stop は置き換える前に空白にする必要があるので注意してください。

これで完了です。
ドキュメント通り進めるだけなので、簡単に構築できると思います。

いよいよ起動

設定が終わったら、いよいよ起動です。

起動確認

Onlineになっています!問題なさそうです。

ここまでがインストールの作業です。
次に、仮想VIPやping疎通監視など設定していきますが、詳細は次回説明したいと思います。
crm configureコマンドを使った設定などご紹介する予定なので、お楽しみに。