Tech Sketch Bucket of Technical Chips by TIS Inc.

機械学習を使って対話システムを作ってみた


はじめに

最近はチャットボットが何かと流行っています。このような機械と自然言語で対話するシステムというのは昔から多くの人に期待されていました。
今回はそんな期待に応えるべく?機械学習を使って対話システムを作ってみました。

リポジトリはこちらです:
HotPepperGourmetDialogue

作成物の概要

今回作成したのは対話を通じてレストラン検索を行うシステムです。イメージとしては以下のような対話を行います。"U"とついているのがユーザ発話、"S"がシステム発話です。

発話
U:スペイン料理店を探して。
S:スペイン料理店ですね。場所はどの辺りですか?
U:新宿周辺
S:新宿のスペイン料理店ですね。予算の上限はどのくらいですか?
U:4000円くらい
S:4000円ですね。それではこのお店はどうでしょうか?
S:(店を出す)

このような対話を通じて、レストランの検索に必要な情報をユーザから取得し、レストラン検索を行います。
今回、レストラン検索にはHotPepperグルメサーチAPIを利用させていただきました。ありがとうございます。


CentOS 7.2+docker 1.11でdocker networkを使ってみた


Docker 1.9がリリースされた時点でのdocker networkの公式ガイドでは、Kernel 3.16以上が必要との記述があったのだが、CentOSのKernelは最新の機能がバックポートされており、docker networkも動作するとの情報を頂いた。
確かに、現在のdocker公式のoverlay networkのガイドを参照すると、この記述が無くなっており、ディストリビュータ側の対応でKernelの制限が解除されたのでは?と考え検証してみることとした。

docker networkの概要については以下の記事も参考にして頂きたい。
Think IT/Docker1.9のマルチホストネットワーク

今回使用した環境は以下となる。

CentOS 7.2のサーバを3台準備し、それぞれにdockerの最新バージョンをインストールする。 docker swarmでクラスタ構成とし、1台をdocker swarmのmaster件nodeに、残り2台をnodeに構成している。

CentOS 7.2のvxlanのバックポート対応の確認

docker swarmのoverlay networkはvxlanを使用し、swarmクラスタで構成されたサーバ内のコンテナ間の通信を可能としている。 本来、vxlanの機能はLinux Kernel 3.12からの実装のはずだが、Redhat系のLinuxはそれ以前のKernelバージョンのOSに対してもバックポート対応として機能を提供している。CentOS 7系だけではなく、CentOS 6.5からバックポート対応としてリリースされている。

vxlanについては以下の記事が非常に参考になる。
ご参考「@IT:VXLAN(RFC7348)を学ぶ」

vxlanがサポートされていることは、以下のコマンドで確認できる。

$ sudo ip link help

出力の最後のTYPEにvxlanが含まれており、vxlanが使用可能であることがわかる。

dockerのインストールとswarmクラスタの構成

最新版のdockerのインストール

1.dockerのインストール
以下のコマンドを実行し、最新版のdocker engineをインストールする。
2016/6現在の最新バージョンは Docker version 1.11.2, build b9f10c9 である。
$ sudo curl -sSL https://get.docker.com/ | sh

2.dockerのサービスの起動と自動起動の設定
$ sudo systemctl start docker
sudo systemctl enable docker

swarmクラスタを使用する為の設定

1.docker deamonの起動オプションの設定
ExecStartの行を以下の形に書き換える。
$ sudo vi /etc/systemd/system/multi-user.target.wants/docker.service

2.firewallの設定
docker swarm managerおよび各nodeの接続を行うポートのfirewall設定の許可設定を行う。
docker swarmのネットワーク接続は以下の構成になる。

(1)manager側の設定
$ sudo firewall-cmd --add-port=8500/tcp --zone=public --permanent
$ sudo firewall-cmd --add-port=2376/tcp --zone=public --permanent
$ sudo firewall-cmd --add-port=4789/udp --zone=public --permanent
$ sudo firewall-cmd --add-port=7946/udp --zone=public --permanent
$ sudo firewall-cmd --add-port=7946/tcp --zone=public --permanent
$ sudo firewall-cmd --add-port=2375/tcp --zone=public --permanent
$ sudo firewall-cmd --reload

(2)node側の設定
$ sudo firewall-cmd --add-port=4789/udp --zone=public --permanent
$ sudo firewall-cmd --add-port=7946/udp --zone=public --permanent
$ sudo firewall-cmd --add-port=7946/tcp --zone=public --permanent
$ sudo firewall-cmd --add-port=2375/tcp --zone=public --permanent
$ sudo firewall-cmd --reload

3.dockerサービスの起動スクリプトのreloadとサービスの再起動
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

以上でdockerのインストールとdocker swarmを使用する為の初期設定が完了である。

docker swarmクラスタの構成

master側の作業

1.consulコンテナの起動
docker swarmの各種情報を保存するKVS(Key Value Store)としてconsulを使用する。
consulの起動にはconsulがインストール済のコンテナを利用する。
$ sudo docker run -d -p 8500:8500 --name consul01 -h consul01 progrium/consul -server -bootstrap

2.swarm managerの起動
swarm managerを起動する。manager兼nodeとして利用する為、外部アクセスポートを2375から2376に変更している。
$ sudo docker run -d -p 2376:2375 --name manager swarm manage consul://10.255.202.97:8500/my_cluster

3.swarm nodeの登録
各サーバのswarm nodeとして登録する。今回は全てmanagerで起動したが、どのnodeでも起動できる。起動したコンテナは起動した追加されたnode上ではなく、起動したサーバ上で動作する。
$ sudo docker run --name tissvv095 -d swarm join --addr=10.255.202.95:2375 consul://10.255.202.97:8500/my_cluster
$ sudo docker run --name tissvv096 -d swarm join --addr=10.255.202.96:2375 consul://10.255.202.97:8500/my_cluster
$ sudo docker run --name tissvv097 -d swarm join --addr=10.255.202.97:2375 consul://10.255.202.97:8500/my_cluster

4.consulへのnode情報の登録の確認
以下のコマンドで、各nodeがconsul上のKVSに登録されたかの確認が行える。
$ sudo docker run --rm swarm list consul://10.255.202.97:8500/my_cluster

5.nodeの詳細情報の確認
以下のコマンドでdocker swarmでクラスタに構成された各nodeの詳細情報が確認できる。
$ sudo docker -H tcp://10.255.202.97:2376 info

overlay networkを作成と接続確認

1.overlay networkを作成
$ sudo docker -H tcp://10.255.202.97:2376 network create --driver overlay --subnet=10.0.9.0/24 my_network

2.overlay networkの作成結果を確認
以下のコマンドで作成したoverlay networkが存在することを確認する。
$ sudo docker -H tcp://10.255.202.97:2376 network ls

3.dockerコンテナを2個起動
以下のコマンドを実行し、ubuntu14_04のコンテナを2個作成する。
$ sudo docker -H tcp://10.255.202.97:2376 run -itd --name=c01 --hostname=c01 ubuntu:14.04
$ sudo docker -H tcp://10.255.202.97:2376 run -itd --name=c02 --hostname=c02 ubuntu:14.04

4.dockerコンテナの起動を確認
作成したコンテナがnodeに振り分けられて起動していることが確認できる。
$ sudo docker -H tcp://10.255.202.97:2376 ps

5.dockerコンテナにoverlay networkを接続
作成した2個のコンテナにoverlay networkを接続する。overlay networkを接続する場合、コンテナ内では新たなNICが接続された状態となる。
$ sudo docker -H tcp://10.255.202.97:2376 network connect my_network c01
$ sudo docker -H tcp://10.255.202.97:2376 network connect my_network c02

6.overlay networkの接続確認
以下のコマンドでoverlay networkへのコンテナの接続状況が確認できる。
$ sudo docker network inspect my_network

7.コンテナ間の通信確認
コンテナに接続し、コンテナ間でpingを実行することで通信の確認を行う。
ホストの指定は名前解決が行われているため、IPアドレス以外にホスト名でも指定できる。
$ docker -H tcp://10.255.202.97:2376 attach c01 root@c01:/# ping -c 4 c02

以上で構築と検証が完了となる。


パスワード認証無しでSSH接続とsudoとsuを実行する方法


Chef/Ansible/Puppet/Itamaeなどのサーバ構築自動化ツールや、ServerSpec/Infratasterなどのインフラテスト自動化ツールの使用することが多くなっている。

これらのツールを使用する為に管理サーバから各ノードに対して制御を行う際に、パスワード入力無しでのSSH接続を行う必要が発生する。さらにインストールやサーバ内の設定作業を実施する為、root権限でコマンドを実行するsudoコマンドやsuコマンドをパスワード認証無しで実行できる必要が発生する。

サーバ構築自動化、テスト自動化ツールを使う上での前提となる「パスワード認証無しでSSH接続とsudoとsuを実行する方法」について、以下にまとめてみた。


Puppet 3.8.7でpuppet kickを使ってみた



puppet logo

ITmedita @ITに、サーバ構築自動化ツール(Chef/Ansible/Puppet/Itamae)の比較記事を執筆させて頂いた。

Puppetの検証の際にあわせて検証を行ったが、記事には記載しなかったpuppet Ver 3.8.7環境およびpuppet kickの実行環境の構築手順と実際の動作検証の結果をまとめたものである。


Docker SwarmとComposeでWordPress環境を構築する


2016年4月13日にDocker 1.11がリリースされました。 今回発表されたDocker Engineは初めてOCI(Open Container Initiative)準拠のツールである、runccontainerdを基にして開発されました。

今回の記事では、新しくリリースされたDocker Engine, Compose, Swarm, Machineを使って、swarm クラスタ上にWordPressを構築してみたいと思います。


Ansibleに代表される自動化/構成管理をホンネで語る (クラウド時代のOSS活用最前線) 〜 オープンソースカンファレンス 2016 Nagoyaでの2団体ジョイント企画【速報版】


5月28日(土曜),オープンソースカンファレンス2016 Nagoya が開催されました。私たちが加盟する,OSSコンソーシアムと,オープンソースビジネス推進協議会(OBCI)は2団体の合同企画としてセミナーとパネルディスカッションを実施しました。テーマは「Ansibleに代表される自動化/構成管理,ホンネで語る自動化/構成管理」です。 20160528_OSC2016Nagoya_(2)セミナー-全景


Pepper + ROSハンズオン勉強会を開催しました


4/6(水)にアトリエ秋葉原にてハンズオン勉強会を開催しました。今回は、ロボット用フレームワークのROS(Robot Operating System)を使ったPepperのアプリケーションを開発体験(ハンズオン)していただきました。その様子をレポートします。

top 写真提供:ロボットスタート株式会社


Hinemos5.0新機能紹介Part2「ノードサーチ」


Hinemos5.0の新機能を紹介するシリーズpart2になります。(part1「Webクライアント」はこちら)

ver 4.1以前では、大規模環境において、以下の理由から設定作業に多くの時間が必要でした。
  ・ 管理対象ノードを1台ずつ登録する必要がある
  ・ エージェントのインストールを1台ずつ実施する必要がある
ver 5.0では、これらの設定作業を一括で実施できるような便利な新機能が搭載されました。

今回はその中でも前者(管理対象ノードを1台ずつ登録する必要がある)の問題を解決してくれる新機能「ノードサーチ」について簡単に紹介します。


ネットワーク仮想化ソフトウェアのOpenVNetでセキュリティグループを使う


 以前の「OpenVNetの紹介」の記事でオープンソースのネットワーク仮想化ソフトウェアであるOpenVNetの仕組みやOpenVNetのもつ機能を紹介いたしました。今回は、OpenVNetの持つさまざまな機能の中のひとつであるセキュリティグループの設定方法及びその性質を解説します。


【コラム】自律移動ロボットへの取組み


TISでは、明治大学理工学部機械工学科ロボット工学研究室(黒田洋司教授)と共に、NEDOが募集した「次世代ロボット中核技術開発」プロジェクトの研究開発項目である「革新的なロボットインテグレーション技術」に応募し、「知識の構造化によるロボットの知的行動の発現研究開発」というテーマで採択され、現在研究開発を進めつつあります。今回の投稿では、私達が何故この取組みを行っているのかと、現在そして今後の取組みの方向性などを簡単にまとめておこうと思います。