St_Hakky’s blog

心理学/人事/就活/留学/データサイエンス/バイオインフォマティクス/日頃思ったことについて書きます。

「API Blueprint」を使ってWeb APIの仕様書を書くことになったのでその時に調べたこととかをまとめる

こんにちは。

APIの仕様書をチームで書いて、その仕様書を元にガリガリ実装していくことになったのですが、今回「API Blueprint」というものを初めて使ったので、その時に調べたこととか参考になったサイトとかをまとめます。

〇本家のサイト

本家のサイトは以下から見れます。

API Blueprintとは

API Blueprintは、APIドキュメント管理ツールです。なぜこんなツールが必要かということなのですが、

  • 開発者が同じフォーマットでドキュメントは書いたほうがいい
  • Gitで管理したい
  • mockサーバーをドキュメントから立ち上げるなどして、フロントの開発が止まるといったことを防ぎたい
  • ドキュメントとコードが乖離しないようにしたい
  • Markdownとかでかけるといいな

などなどといった欲求があるからです。以下のサイトが非常にわかりやすくて参考になりました。

dev.classmethod.jp

〇他のAPIドキュメント管理ツールとの比較

API Blueprint以外にも、swaggerなどといったツールがありますが、それについては以下の資料がわかりやすくまとまっていました。

API Blueprint周りのツールについて

■aglio

これを使うと、API BlueprintをHTMLに変換してくれます。

api-blueprint-preview/language-api-blueprint

Atomを使っているユーザーなら入れておきたいプラグインです。api-blueprint-previewはリアルタイムでプレビューを出してくれます(自分は結局、gulpでmarkdownからhtmlに変換して、自動更新をさせるようにしたので、これは途中から使わなかったですが)。

api-mock

API Blueprint形式でかいたドキュメントから、モックサーバーを自動で立ち上げてくれるツールです。

しかし、このインストールで結構はまりました、、、汗(それは後述します)

■Dredd

API Blueprintのドキュメントを元に実装をテストしてくれるツールです。これにより、ドキュメントとコードの乖離を防ぐことができます。

■gulp

Node.jsをベースとしたビルドツールです。これであらゆるタスクを自動的に実行させることができます

API Blueprintとは直接関係はないですが、これによりMarkdownを更新した時に自動でHTMLファイルに変換させるみたいなことができるようになり、便利です。

■gulp-aglio

これは、aglioをgulpで使い、Blueprintで書かれたMarkdownをHTMLに変換してくれるツールです。跡で紹介しますが、これを使って、ファイルの更新を取得→自動的にMarkdownからHTMLに変換という処理をgulpで行うことができます。

API Blueprintを使うならしておきたい設定

以下のサイトの設定たちが最高にcoolだったので、これを参考に環境構築や設定は行いました。

自分は、こちらを参考にして、これに追加でapi-mockもいれて、自動でモックサーバーも起動できるようにしました。

api-mockを使う時の注意点

一番最初の注意点は、私はWindowsで開発をしていたのですが、api-mockに渡すMarkdownのファイルの改行コードがLFでないとエラーがでます(笑)。

これは、protagonistっていうAPI blueprintのParserが原因のようです。

また、nodeのバージョンが5か6だと、api-mockが使用しているprotagonistのインストールでこけます(自分はこけました)。なので、nodeのバージョンを4に落として開発しています笑(つらい)。5でも動いたよっていう情報もあったんですが、自分は試してません。

上の資料を読んでいろいろ試していたら一通り使えるようになったので、とりあえずおっけーかなと。
それでは。

sshfsを使ったのでまとめる(Centos 7)

こんにちは。

sshfsをCentos7で使って、リモートのサーバーにあるファイルをマウントする処理を行おうと思い、やりましたのでメモしておきます。

Centosの環境

$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

〇sshfsのインストール

世の中に出回っているサイトでは割とすんなり入った感じで書かれてましたが、そうではなかったので、一つ一つめもしていきます。

■EPEL Repositoryの導入

標準では、yumでsshfsをインストールできないので、EPEL Repositoryを導入します。

こちらのサイトが参考になりました。他のバージョンについても導入方法が乗っています。

$ wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-10.noarch.rpm
$ rpm -ivh epel-release-7-10.noarch.rpm

それか以下の方法でもできます。Centos7.1の標準レポジトリからインストールできるみたいです。

$ sudo yum install epel-release

こちらのサイトにあるように、もうRPMForge (RepoForge)は終了しているので(と言ってもかなり前ですが。一部のサイトでこちらからインストールしているものがあったので一応書いておきます)、EPELから入れました。

■sshfsのインストール

epelレポジトリからインストールする場合は、sudo yum --enablerepo=epel install package_name みたいな感じでできます。

$ sudo yum install fuse-sshfs --enablerepo=epel
$ sudo modprobe fuse

〇sshfsを使う

■マウント

マウントする時は以下のようなコマンドで行います。

$ sshfs <host_user_name>@<host_ip>:<host_dir_path> <local_dir_path>

# 例
$ sshfs st_hakky@example.com:/hoge/hoge /fuga
■アンマウント
$ fusermount -u /local/dir/path

GPUを使用する時によく使うコマンドとかまとめた

こんにちは。

GPUの種類の確認

lspci | grep -i nvidia

nvidia driverのバージョン確認コマンド

cat /proc/driver/nvidia/version

nvidia-smiコマンド

オプションはたくさんあります。よく使うコマンドとか、探している時に便利そうだなと思ったものを以下に列挙します。

オプション オプションで出力できる内容
オプションなし サマリ
-L, --list-gpus GPUを列挙
-i, --id= GPUを指定
-f, --filename= ファイルに出力
-l, --loop= 指定されたインターバル(デフォルト5秒)で表示を続ける。Ctrl+Cでとめる。
-q, --query GPU情報表示
-d, --display= 特定の項目だけ出力 カンマでつなげる。MEMORY,UTILIZATION, ECC, TEMPERATURE, POWER, CLOCK,COMPUTE, PIDS,PERFORMANCE, SUPPORTED_CLOCKS, PAGE_RETIREMENT, ACCOUNTING.

また、以下のコマンドとかはすごく便利。

# 10秒おきにGPUのサマリを表示
$ nvidia-smi -l 10

# watchで10病おきにCPUのサマリを表示
$ watch -n10 "nvidia-smi"

# GPUを使ってるプロセスを知る
$ nvidia-smi -q -d PIDS

Neural Networkで使う活性化関数について調べたのでまとめてみた

こんにちは。

ニューラルネットワークでは活性化関数を設定する必要があるわけなんですが、その活性化関数の種類は知っていてもどんなときにどんなものを使うといいか、なんかそのイメージがぱっとわくものがないかなぁと思って、調べてみました。

○活性化関数の種類

以下に代表的なものを載せます。

  • Step function
  • Linear function
  • softplus function
  • sigmoid function
  • hard sigmoid
  • tanh (hyperbolic function)
  • softsign function
  • ReLU (Rectified Linear Unit) function
  • Leaky ReLU function
  • PReLU (Parametrized ReLU) function
  • Thresholded ReLU
  • Exponential Linear Units(eLU)
  • SeLU
  • Gumbel-Softmax

式を書こうかなぁと思ったのですが、上の関数のほとんど全部が以下のサイトで可視化されていて、すごくわかりやすいのでもうこれでいいやとなりました笑(手抜きw)。

dashee87.github.io

各活性化関数の値と式がでているので、わからなくなったらここに立ち返ればよいかと。

Google Play Groundで活性化関数の影響を見る

以下のサイトで、インタラクティブにNeural Networkにおける活性化関数の影響を見ることができます。

playground.tensorflow.org

活性化関数の影響を見るために、色々活性化関数を変えながら出力結果がどのように変化するかためせて普通におもしろい。

それでは。

keras(tensorflow/theano/cntk)でGPUをnvidia-dockerから使ってみた (+αでLasagneも入れた)

こんにちは。

今回は、主にDeep LearningGPUで実行できる環境をDockerで作ってみました。主に入れたものは以下のものです。

keras=2.0.8
tensorflow_gpu=1.3.0
theano=0.10.0beta3  # 特定のチャンネル内に存在するパッケージ。理由は下記参照。
cntk=2.1
lasagne=0.2.dev1
python 3.5
miniconda 3-4.2.12

上のもの以外にもいれていますが、だいたいやりたいことはできるような感じで環境は作りました。全部のDeepLearningフレームワークで、GPUが使えるようになっています。

今後もバージョンを変えたりとかすれば、簡単にGPU環境を用意できそうなので、自分用のためにも以下、メモしておこうと思います。

初期セットアップ・環境

nvidia-dockerのインストール

今回のDockerfileはnvidia-dockerがインストールされていることが必須です。

インストールについては以下のページで書いたとおりにインストールしました。

st-hakky.hatenablog.com

○環境

Ubuntu環境
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"
GPU周り
$ lspci | grep -i nvidia
05:00.0 VGA compatible controller: NVIDIA Corporation GK104GL [Quadro K4200] (rev a1)
05:00.1 Audio device: NVIDIA Corporation GK104 HDMI Audio Controller (rev a1)
06:00.0 VGA compatible controller: NVIDIA Corporation GM200 [GeForce GTX TITAN X] (rev a1)
06:00.1 Audio device: NVIDIA Corporation Device 0fb0 (rev a1)
0a:00.0 VGA compatible controller: NVIDIA Corporation GM200 [GeForce GTX TITAN X] (rev a1)
0a:00.1 Audio device: NVIDIA Corporation Device 0fb0 (rev a1)
■dockerのバージョンなど
$ sudo docker version
Client:
 Version:      17.06.2-ce
 API version:  1.30
 Go version:   go1.8.3
 Git commit:   cec0b72
 Built:        Tue Sep  5 20:00:17 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.06.2-ce
 API version:  1.30 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   cec0b72
 Built:        Tue Sep  5 19:59:11 2017
 OS/Arch:      linux/amd64
 Experimental: false

kerasのGPU実行環境の作成

ここまでで、nvidia-dockerの準備はできたので、あとはベースのイメージをnvidia-dockerにしてkerasの実行環境を作っていきます。

○参考にしたサイト

ここからの内容は、以下のサイトにあるDockerfileを参考、自分なりにアレンジしました。巨人の皆さん、ありがとうございます。

○作成したもの

以下のGithubにおいてあります。

github.com

○使い方

使い方は以下の通り。

■ファイルの配置

レポジトリにあるすべてのファイルを、プロジェクト(実行したいDeep Learningと同じ環境)のルートに置きます。置かなくてもボリュームをいじればいいんですが、面倒だと思うので、コピーしてプロジェクトのルートに置くのが良いと思います。

ファイルの構成は結局以下のような感じになると思います。

- Dockerfile
- Makefile
- requirements.txt
- theanorc

...
- project_src
Dockerfileの編集

Dockerfileの編集を行う必要があります。基本的に編集するのは4行だけです。

###
# 略
###

# 以下を自由に設定する
MAINTAINER MAINTAINER_NAME <EMAIL>

###
# 略
###

# 以下のユーザー名、userid、groupidにホストと同じものをいれる。
ENV NB_USER user_name
ENV NB_UID 12345
ENV NB_GID 12345

###
# 略
###

ホスト側のユーザー名、userid, groupidについては、ターミナルからidと打てば確認することができます。これらをホストと同じようにDocker上で設定しておかないと、マウントしたボリュームにDockerからファイルを作成したり編集したりすることができなくなるので、注意が必要です。これについては下でも書いてあるので、参照してください。

Makefileの編集

Makefile内の変数を適時編集してください。cudaなどのバージョンなどは自由に設定できます。

Image名とかは気になれば編集するほうがいいかと(適当なので)。

requirements.txtの編集

必要な追加のpythonパッケージがあれば追加してください。追加すると、自動でインストールしてくれます。

■makeコマンドでbuild/run

実行するコマンドが長いので、Makefileを用意しています。使い方は以下の通り。

# Dockerfileのビルドを実行。まずはこれでビルドしてください。めっちゃ時間かかります笑。
make build

# Dockerfileのイメージを実行して、bashを起動します。
make bash

# Dockerfileのイメージを実行して、ipythonを起動します。
make ipython

# Dockerfileのイメージを実行して、jupyter notebookを起動します。
make notebook

Makefileの中に、指定できる変数などを用意しているので、適時変更して使用することができます。詳しくはコードを見てください。

編集時の注意事項とかハマったことのメモ

○Theanoのバージョン

Theanoは開発が終了してしまっていますが、開発段階で最新であったバージョンの0.9では、gpu使用時の注意があります。Theanoのバージョン0.9では、pygpuに関するエラーに対処していない(というよりも開発が終了していて対応する予定はないというツラミな感じ、、、)とのことで、今回はバージョンはむやみに最新を使うのは避けました。

以下が参考サイトです。

github.com

■[2017/10/12追記]

上記のバージョンで以下のissueで見られるようなエラーが出たので、バージョン0.9ではなく、condaで特定のチャンネルで管理されているバージョンをいれることにしました。

github.com

○Dockerのパーミッション

このDockerfileを作成した時に一番ハマったのが、マウントしたボリュームのパーミッションの設定についてです。

こちらのサイトによれば、uidとgidがDockerとホストの両方で同じであれば、両方のユーザーが同じユーザーとしてみなされ、パーミッションの問題が解決されます。

今回はこれで対応できました。

■参考サイト


そんな感じですね。

Dockerfileとか書くのあんまりうまくないので、何か改善点とかあれば教えて欲しいです。
それでは。