20190301のDeepLearningに関する記事は6件です。

SingularityコンテナをBuildする方法まとめ(Singularity v3.0.3)

はじめに

前回,CnetOS7にSingularityをインストールしてみる記事を書きました.この記事でコンテナエンジンは手に入ったので,今回は自分の好きな環境を構築したコンテナイメージを作ってみたいと思います.

なお,この記事で扱うのはDockerではなく,Singularityと呼ばれるHPC向けのコンテナエンジンです.この記事で扱う環境は以下のとおりです.

  • Singularity version: v3.0.3
  • サーバOS: CentOS 7.6
  • 計算をさせるサーバにはSSHなどでログインできるがroot権限はない

Buildとは

自分の必要とするソフトウェアや機能などを組み込んだコンテナを作ることです.作業フローは次のようになります.

  1. コンテナの定義ファイル(?)である,Singularity Definition File(hoge.def)を書く,Dockerfileみたいなもの
  2. Singularity buildコマンドでhope.defからイメージファイル(SIF)を生成する
  3. 生成した.sifファイルを計算機などに配置し,使う

.defファイルの書き方は,公式のUser Guideに書いてあります.

複数のBuild方法

Singularityのコンテナイメージを作成する方法として以下の3つが挙げられます.

  1. DockerHubやSingularityHubなどコンテナレジストリにあるイメージをダウンロードしてきて使う(そもそも自分でイメージを作らない)
  2. 自分でdefファイルを書いて,自分のPCでビルドする
  3. Sylab社が提供しているRemote Builderを用いてビルドする

2番目と3番目の方法では,ビルドして生成されたコンテナイメージを何らかの方法(scpとか?)でサーバに送って,利用することになります.1番目の方法は,サーバにそのままダウンロードしてくれば大丈夫です.この流れを図にすると次のようになります.

1の方法については前回の記事でChainerやJuliaのコンテナを動かして紹介済みなので,ここでは2と3について紹介します.

ローカルPCでビルドする

ビルドするためにはSingularityがインストールされ,root権限を行使できるPCが必要です.Linuxならインストールできますが,MacやWindowsの場合は,対応していないので,公開されているVagrant boxを使ってVMを立ち上げます.

SingularityがインストールされたPCでビルドする

以下のコマンドでhoge.defからburi.sifをビルドできます.
Singularityコンテナの実行はユーザの権限でできますが,defファイルからのbuildはroot権限が必要になります.

sudo singularity build home.def buri.sif

MacやWindowsでビルドする

SingularityのVagrant boxが公開されているので仮想マシン上でビルドできます.ただし,VirtualBoxとVagrantのインストールが必要です.

まずVagrantでVMを起動します.適当なディレクトリで,

vagrant init sylabs/singularity-3.0-ubuntu-bionic64
vagrant up
vagrant ssh

VMにhoge.defを共有フォルダか何かで配置します.続いて,hoge.defを置いたディレクトリで以下を実行します.

sudo singularity build home.def buri.sif

なお,.sifファイルは読み込み専用ファイルですので,中に入ってapt installなどはできません.その時は-sオプションで書込み可能な形式でビルドする必要があります.

Remote Builderを使う

Sylab社がRemote Builderを公開しています.これを使えば,自前でSingularityをインストールした環境を用意しなくてもビルドできます.これには二通りの使い方があります.

  1. Remote Builderのサイトに.defファイルをアップロードしてビルドする
  2. ビルドコマンドの --remoteオプションを使ってコマンド経由でビルドする(今回失敗)

Remote Builderのサイトでビルドする方法

サイトにアクセスし,Build Recipe Fileでdefファイルを選択するか,コピペして貼り付けたのち,Buildボタンを押してしばらく待つとビルドされます.ちょっと時間がかかるようです.
remote_builder.png

--remoteオプションを使う (上手く出来なかった・・・)

root権限のないPCや実際のサーバ上でビルドするときに便利です.

まず,アクセストークンを作り("get one here"をクリックして作成し,ダウンロード),コマンドを走らせるコンピュータの~/.singularityフォルダに保存します.

remoteOption.png

その後,以下のコマンドでビルドします.

singularity build --remote home.def buri.sif

本来ならこれでビルドされたsifファイルがダウンロードされてくると思うのですが,私の環境ではいくらやてもうまくいきませんでした・・・

なぜか途中でエラーが出てしまいました.

matplotlib入りchainerコンテナを作ってみた

DockerHubで公開されているchainerコンテナはmatplotlibやOpenCVが入っていなかったので,これらを入れたコンテナを作成しました.まだちゃんと動くかは検証しきれていませんが・・・

chainer.def
# Chainer container for singularity

Bootstrap: docker
From: chainer/chainer:latest-python3

%post
    apt update
    apt install -y libpng-dev libjpeg-dev libtiff-dev python3-tk libglib2.0-0 libsm6
    export LC_ALL=C
    pip3 install matplotlib pandas scipy scikit-learn tqdm opencv-python

%label
    Author horithe3rd
    Version v1.0.2

GitHubに公開しました.

終わりに

今回は自作のコンテナをdefファイルからビルドしてみる方法をまとめました.
自分用コンテナを作って,ローカルでもハイパワーなサーバでも同じ環境がすぐ手に入ります,

本記事では,defファイルの書き方についてはまとめませんでしたが,どこかの機会でまとめるかもしれません(今まさに勉強中なのでわからないことだらけです・・・).

また,サーバ管理者としては,ユーザが自分で自由に環境を作ってくれるので,色々とインストールを頼まれることが減ると嬉しいなぁと思います.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Python】インストール方法 (Anaconda)

概要

Pythonのインストール方法について説明する.
データ分析などに使うことを考え,Anacondaディストリビューションを利用する.
Pythonを直接インストールする場合は,他のサイトを参考にして頂きたい.

Pythonとは

Pythonは,プログラミング言語の一種である.プログラミング言語のうちスクリプト言語という種類に分類される.Pythonは以下のような長所を持つ.
1. 文法(=プログラミング言語が持つルール)がとてもシンプルである. ➡覚えやすい・使いやすい.可読性が高い.
2. 標準ライブラリ外部ライブラリが充実している. ➡簡単に高度なプログラムを作ることができる.

Pythonのインストール

バージョン

Pythonには,2系と3系という2つのバージョンが存在する.この二つには後方互換性がなく,Python 3系で書いたプログラムがPython 2系では実行できないといったことが起こる.よって,Python 3系を使うことをおすすめする.

ディストリビューション

ユーザが一括してインストールできるように,ライブラリなどがひとつにまとめ上げられたものをディストリビューションという.ここでは,データ分析に重点を置いたAnacondaというディストリビューションを利用する.AnacondaにはNumPy(=数値計算のためのライブラリ)やMatplotlib(=グラフ描画のためのライブラリ)など,データ分析に有用なライブラリが含まれている.リンクより,ディストリビューションをダウンロードし,インストールを行う.

参考文献

  1. 斎藤 康毅, "ゼロから作るDeep Learning -- Pythonで学ぶディープラーニングの理論と実装," 株式会社オライリー・ジャパン, 2016
  2. 柴田淳, "みんなのPython 第3版," SBクリエイティブ株式会社, 2012
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Python】インストール方法

概要

Pythonのインストール方法について説明する.
データ分析などに使うことを考え,Anacondaディストリビューションを利用する.
Pythonを直接インストールする場合は,他のサイトを参考にして頂きたい.

Pythonとは

Pythonは,プログラミング言語の一種である.プログラミング言語のうちスクリプト言語という種類に分類される.Pythonは以下のような長所を持つ.
1. 文法(=プログラミング言語が持つルール)がとてもシンプルである. ➡覚えやすい・使いやすい.可読性が高い.
2. 標準ライブラリ外部ライブラリが充実している. ➡簡単に高度なプログラムを作ることができる.

Pythonのインストール

バージョン

Pythonには,2系と3系という2つのバージョンが存在する.この二つには後方互換性がなく,Python 3系で書いたプログラムがPython 2系では実行できないといったことが起こる.よって,Python 3系を使うことをおすすめする.

ディストリビューション

ユーザが一括してインストールできるように,ライブラリなどがひとつにまとめ上げられたものをディストリビューションという.ここでは,データ分析に重点を置いたAnacondaというディストリビューションを利用する.AnacondaにはNumPy(=数値計算のためのライブラリ)やMatplotlib(=グラフ描画のためのライブラリ)など,データ分析に有用なライブラリが含まれている.リンクより,ディストリビューションをダウンロードし,インストールを行う.

参考文献

  1. 斎藤 康毅, "ゼロから作るDeep Learning -- Pythonで学ぶディープラーニングの理論と実装," 株式会社オライリー・ジャパン, 2016
  2. 柴田淳, "みんなのPython 第3版," SBクリエイティブ株式会社, 2012
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

機械学習論文読みメモ_162

Smallify: Learning Network Size while Training
様々なハードウェアやアプリケーションにDNNを適用するにあたって、
それぞれに適当なモデルサイズ、精度、予測時間を実現する事は重要である。
従来手法はそれらを異なったステージで最適化してきたため、最適な設計が
難しかった。
本論で提案する手法はそれら要素を同時に最適化可能である。
提案モデルは、学習時にニューロンレベルの枝刈りを行う事で
モデルサイズと性能を調整する。
この枝刈り手法は、さらに密な重み行列を作成するため、
計算効率も良い。

Measuring the tendency of CNNs to Learn Surface Statistical Regularities
CNNは汎化性能が高い一方でadversarial exampleには脆弱である。
この事実はCNNが高い抽象レベルの特徴を獲得出来ていない事を示唆する。
本論はCNNが主に表面的なstatistical regularityを学習している事を示す。
この事を示すために、Fourier filteringを適用する事でデータの高レベル特徴を
保ったままそれ以外の統計値を変化させたデータを作成し、学習に用いた。
結果、CNNはFourier filterで変化させた部分を学習する傾向が強い事が分かり、
特に変化させたデータで学習したモデルのテストデータに対する汎化ギャップが増加する事がわかった。
またCNNの深さを増加させてもこうした汎化ギャップを低減する効果は低い事がわかった。

Why do deep convolutional networks generalize so poorly to small image transformations?
画像に対するCNNは、画像への小さなtranslationやdeformationに対して頑健である事が仮定される。
本論では、最新のCNNモデルはそうした小さなtranslationに対して大きくその出力結果を変えてしまう事
を示す。
さらにこうした脆弱性は現実で起こりうるようなtranslationについても同様である。
またこの脆弱性はCNNをより深い構造にするほど顕著に観測される事が分かった。
この原因は最近のCNNで普及しているstrideを利用したsamplingにある。
つまりsamplingが存在する事である特定のtranslationに対してのみしかCNNは反応する事
ができなくなってしまう事が原因となっている。
また一般的に利用されるデータセットが持つbiasの影響も上記のtranslation invarianceに
対して影響を与えている。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

StyleGANの2方向マッピング

Deep Learning初心者故、間違いがありましたら指摘いただけると幸いです。

今更だけどStyleGANて何

StyleGAN「写真が証拠になる時代は終わった。」に全てが書いてあります(丸投げ)

原文を読みたい数奇な方はA Style-Based Generator Architecture for Generative Adversarial NetworksにPDFが置いてありますので、どうぞ

よく見るやつ

$A$と$B$を混ぜ合わせるといい感じに$AB$の中間画像を表示するぞ!
image.png

3個混ぜたいんだけど

ggっても中々出てこない上に、にこやかに笑った人達の顔ばっかり出てくる
俺はキャラの顔でやりたい

じゃけん実装しましょうね

手軽に試してみたかったので、今回はこちらのColaboratory Bookをお手本に学習済みのモデルを利用させて頂きました

2方向のマッピングをするには???

先ず二つの画像を取り出しているコードを読んでみる

# generate images code interpolated across one of the 512 dimensions
init_latent = np.random.RandomState(seed).randn(1, Gs.input_shape[1])[0]

def apply_latent_fudge(fudge):
  copy = np.copy(init_latent)
  copy[interpolate_dim] += fudge
  return copy

interpolate = np.linspace(0., 30., 10) - 15
latents = np.array(list(map(apply_latent_fudge, interpolate)))

ノイズであるinit_latentに対してinterpolateを与えることで2点間の変化を取り出している気がする
多分こんなイメージ

N = \begin{bmatrix}
R_0\dots R_d
\end{bmatrix} \\
I = \begin{bmatrix}
J \dots K
\end{bmatrix} \\
L = \begin{bmatrix}
(N + I_0) \dots (N + I_n)
\end{bmatrix}

$N$ := Noise, $I$ := Interpolate, $J,K \in \mathbb{Z^+}$, $R_d$ := Random Value

なんでInterpolateをノイズに与えることで別の画像へ近づくのかがいまいち理解できていないが
これを2方向にするとなると多分こうなる

N_1 = \begin{bmatrix}
R_0\dots R_d
\end{bmatrix} \\
N_2 = \begin{bmatrix}
R'_0\dots R'_d
\end{bmatrix} \\
I = \begin{bmatrix}
J \dots K
\end{bmatrix} \\
L = \begin{bmatrix}
(N + I_0) \dots (N + I_n)
\end{bmatrix} \\
L = \begin{bmatrix}
L_1 \dots L_2
\end{bmatrix}

単純にInterpolateを加えたノイズを二つ用意して、線形補間すればいいんじゃなかろうか的な思考

一応できた

image.png

def apply_latent_fudge(fudge, target_latent):
  copy = np.copy(target_latent)
  copy[interpolate_dim] += fudge
  return copy


def gen_interpolate():
  return np.linspace(0, 30, width)

interpolate = gen_interpolate()
applier1 = lambda f: apply_latent_fudge(f, init_latent1)
latent1 = np.array(list(map(applier1, interpolate)))
applier2 = lambda f: apply_latent_fudge(f, init_latent2)
latent2 = np.array(list(map(applier2, interpolate)))
def v_linspace(i):
  v = np.array(list(map(lambda l: np.linspace(latent1[i][l], latent2[i][l], height), range(latent1.shape[1]))))
  v = v.transpose()
  return v
combined_latent = np.array(list(map(v_linspace, range(width))))
combined_latent = np.array(list(map(lambda x: x.flatten(), combined_latent.transpose()))).transpose()

images = Gs.run(combined_latent, None, **synthesis_kwargs)

StyleGAN 2way mapping (Google Colab)
出来たんだけど、理解しきれていないのでもやもやする
あと2wayじゃなくて4頂点間の補間な気がしなくもない

もし宜しければ指摘いただけると幸いです

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

機械学習論文読みメモ_161

On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima
SGDで最適化を行う際、小さなバッチを用いた学習が行われるが、
このバッチサイズを大きくした場合に、SGDによる汎化性能向上効果が低減する
事が実用上分かっている。
本論ではその原因を探り、大きなバッチサイズを利用するとよりsharpな極値へ収束
しやすくなることを数値的に示した。
そして経験的にsharpな極値におけるモデルは低い汎化性能になる事が知られている。
一方で小さなバッチサイズを用いた場合には、一貫して平坦な極値へ収束し、
これは小さなバッチサイズを用いた事によるノイズ混入が原因である事がわかった。

Pooling is neither necessary nor sufficienc for appropriate deformation stability in CNNs
CNNに関する仮定の一つに、CNNは入力の小さなtranslationやdeformationに関して頑健であることが
画像認識タスクを解くに当たって重要である、という事がある。
その頑健性はCNNにpooling layerを入れ込む事で実現されてきた。
しかし最近の研究においてpooling layerの利用はされなくなってきた。
これは先程の仮定に疑問を差し込む。
本論では改めてこの仮定を検討した。
結論として以下の知見が得られた。
1.Deformation invarianceは各層毎に異なったレベルで要求される。
2.Deformation invarianceは学習を通して適応的に学習される。
3.pooling layerはそうした必要なレベルのinvarianceを獲得するにあたって不要か、不十分である。
4.学習初期において、pooling layerが導入するinvariance性、学習へ悪影響を与える。結果として学習プロセスにおいてpooling layerを影響をキャンセルさせるような学習がなされる。

Fast and Furious: Real Time End-to-End 3D Detection, Tracking and Motion Forecasting with a Single Convolutional Net
3D detection, tracking, motion forecastingを同時に行う事が可能な単一のCNNモデルを提案する。
複数のタスクに関して理由付けを行う構造により、この総体的な手法はocclusionや遠距離の
スパースデータに対しても頑健性を持つ。
提案手法はLidarなどの3D sensorデータを入力とし、鳥瞰視点のデータとして時空間方向に3D convolutionsを適用する。
モデルは時間方向の情報を前段・後段どちらの層でfusionするかの違いで2つの構造を提案する。
これら2つの構造は精度と効率性の関係においてトレードオフ関係がある。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む