のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

久々に自作PC作りました

皆さんこんにちは
お元気ですか。私は元気です。

私、久々に自作PCを作成してみました。

目的

Kaggleやり始めてGPUマシンが欲しくなった。計算時間の短縮を図る。
結構ハイスペックにします。OSはUbuntu14.04 Serverです。

購入物品

マザーボード

なんでもいいっす

ASUSTeK Intel H97チップセット搭載マザーボード H97-PRO 【ATX】

ASUSTeK Intel H97チップセット搭載マザーボード H97-PRO 【ATX】

CPU

結構悩みましたが、暫く、そこまでCPUの爆発的向上はないと思い、適当に購入

i7-4790K(Devil's Canyon 4.00GHz) LGA1150

i7-4790K(Devil's Canyon 4.00GHz) LGA1150

Memory

32GB欲しいです。

GPU

これはかなり悩みました。
GTX970は致命的な欠陥を抱えています。NDIVIA社は仕様として貫き通していますが、、
3.5G以上メモリを使うと急激に速度が低下するような設計になっているようで、何やら返品騒ぎとかになってるそうです。

Users Reporting Memory Allocation Issues On 4 GB GTX 970 Graphics Cards - Games Not Utilizing Full VRAM

僕はそこまでメモリを使うゲームとかしないので、GTX970を選択しました。

電源

適当、そこまで電力食わないので、割りと安いのを

Corsair CP-9020059-JP (CX500M)

Corsair CP-9020059-JP (CX500M)

ケース

少し、静音を気にしました。何分自室にあるものですから。。。

ANTEC XL-ATX対応静音PCケース P280

ANTEC XL-ATX対応静音PCケース P280

SSD

256GBあれば、特に他に問題はないので適当に購入

完成画像

f:id:tereka:20150213121202j:plain

感想

正確にベンチマークを行っていないのですが、
GPUは強かった。プランクトン(Kaggle)を学習させているのですが、CPUより凄く速いです。

Ubuntu14.04 ServerでCUDA 6.5.14の環境を整える

皆さんこんにちは
お元気ですか。私は元気です。

さて、今日はUbuntu 14.04 ServerでCUDAの環境を整えようと思います。
何やらapt-getを使う方法がweb上では沢山見受けられますが、今回はrunを使ってインストールしてみます。

環境

OS:Ubuntu 14.04 Server LTS
CPU:Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz
GPU:GeForce GTX 970

sudo apt-get install build-essential

Driverについては別のversionを利用したいので、extractを使ってDriver ,Tool kit,Sampleを分離します。

wget http://developer.download.nvidia.com/compute/cuda/6_5/rel/installers/cuda_6.5.14_linux_64.run
sudo a+x ./cuda_6.5.14_linux_64.run
./cuda_6.5.14_linux_64.run -extract=/home/user/ndivia_installers

nouveauに邪魔されておそらく動作しないと思います。インストールできたら幸せです。下手にやるとこんなメッセージも出ます。

Unable to load the kernel module 'nvidia.ko'.  This happens most frequently when this kernel module was built against the wrong or
         improperly configured kernel sources, with a version of gcc that differs from the one used to build the target kernel, or if a driver
         such as rivafb, nvidiafb, or nouveau is present and prevents the NVIDIA kernel module from obtaining ownership of the NVIDIA graphics
         device(s), or no NVIDIA GPU installed in this system is supported by this NVIDIA Linux graphics driver release.

         Please see the log entries 'Kernel module load error' and 'Kernel messages' at the end of the file '/var/log/nvidia-installer.log'
         for more information.

ということでこのnouveauを無効化します。

nouveauの無効化

まずは、ファイルを編集します。

vim /etc/modprobe.d/blacklist-nouveau.conf

以下の文字を記載してください。

blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off

次にoptionを追加

echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf

更新する

update-initramfs -u
reboot

Install

cd nvidia_installers
sudo ./cuda-linux64-rel-6.5.14-18749181.run
sudo ./cuda-samples-linux-6.5.14-18745345.run
sudo ./NVIDIA-Linux-x86_64-340.29.run

※ドライバが新しいものが必要な場合は公式から取得します。
NVIDIAドライバダウンロードのページから取得してください。
実行方法は同じです。

Sample

cd /usr/local/cuda/samples/1_Utilities/deviceQuery
make
./deviceQuery

近況報告とKaggle

皆さんこんにちは
お元気ですか。私は元気です。

最近は修士論文も修了し、来年からの社会人生活を送るための準備してます。
引っ越しって大変ですね。

最近はKaggleと呼ばれるデータを扱うコンペティションを集めたサイトがあるのですが
このKaggleのいくつかのコンペに出場しています。
主に解読しているのは2つです。

プランクトン分類
マルウェア分類

torch7を使って記載しています。なんか扱いやすいのでこのライブラリを使っています。
正直、これらのコンペティション皆強くて面白いです。Forumの文章読んでいるだけでも参考になります。

過去の結果と上位の解析手法は公開されているので色々と勉強になります。皆さんもよければ、やってみましょう。

各コンペティションが終わったら、僕の解法ぐらい掲載しようかなと思います。

Torch7によるニューラルネットワークを使った機械学習

皆さんこんにちは
お元気ですか。私は元気です。

Torch7を使って具体的に、機械学習を実装してみようと思います。

Torch7におけるフレームワーク

基本的に以下に添って実装すれば問題ありません。

1.データセットを構築する
2.モデルを構築する
3.学習する
4.テストする

※コードはこちらを参考にさせて頂いてます。
nn/training.md at master · torch/nn · GitHub

実際の過程

データセット構築

データセットの入力と出力の構築は基本的にtorch.Tensorで行います。

dataset={};
function dataset:size() return 100 end
for i=1,dataset:size() do 
  local input = torch.randn(2);
  local output = torch.Tensor(1);
  if input[1]*input[2]>0 then
    output[1] = -1;
  else
    output[1] = 1
  end
  dataset[i] = {input, output}
end

①datasetテーブルを設定し、入力と出力を入れること
入力、出力共に、torch.Tensorで設定しますが、それぞれをテーブルに入れます。
それを以下の通り入力します。

dataset[i] = {input, output}

②labelもinputもtorch.Tensorで

local input = torch.randn(2);
local output = torch.Tensor(1);

③function dataset:size() return 100 endを定義すること
後述するトレーニング内の関数で、この関数を呼び出しているので、なければ、動きません。

モデル構築

nnパッケージを使って実装します。
nn.Sequential()が層を作るように
nn.Linearの追加により層を増やすことができます。
よくある発火関数、Tanhを後で追加することで、ニューラルネットワークを構成することができます。

以下、入力層2,中間層50,出力層1のニューラルネットワークです。組み合わせ方によってConvolutional Neural NetworkやAutoEncoderを作ることができるそうです。

model = nn.Sequential();
model:add(nn.Linear(2,50))
model:add(nn.Tanh())
model:add(nn.Linear(50, 1))
model:add(nn.Tanh())

因みに内部の構成は以下のような感じになります。

nn.Sequential {
  [input -> (1) -> (2) -> (3) -> (4) -> output]
  (1): nn.Linear(2 -> 50)
  (2): nn.Tanh
  (3): nn.Linear(50 -> 1)
  (4): nn.Tanh
}

学習する

誤差関数を指定し、学習を開始します。(以下のは2乗誤差)
trainerのメンバ変数(luaではなんと呼ぶのでしょうか?)にパラメータを与えることで学習回数や学習係数を設定することができます

criterion = nn.MSECriterion() 
trainer = nn.StochasticGradient(model, criterion)
trainer.learningRate = 0.01 --学習係数
trainer.maxIteration = 100 --学習回数
trainer:train(dataset)

テストする

先程、学習したモデルでforwardを実行します。与え方はtorch.Tensorで与えます。

x = torch.Tensor(2)
x[1] =  0.5; x[2] =  0.5; print(model:forward(x))
x[1] =  0.5; x[2] = -0.5; print(model:forward(x))
x[1] = -0.5; x[2] =  0.5; print(model:forward(x))
x[1] = -0.5; x[2] = -0.5; print(model:forward(x))

Source Code 全文

require 'torch'
require 'nn'

dataset={};
function dataset:size() return 100 end
for i=1,dataset:size() do 
  local input = torch.randn(2);
  local output = torch.Tensor(1);
  if input[1]*input[2]>0 then
    output[1] = -1;
  else
    output[1] = 1
  end
  dataset[i] = {input, output}
end

model = nn.Sequential();
model:add(nn.Linear(2,50))
model:add(nn.Tanh())
model:add(nn.Linear(50, 1))
model:add(nn.Tanh())

criterion = nn.MSECriterion() 
trainer = nn.StochasticGradient(model, criterion)
trainer.learningRate = 0.01 --学習係数
trainer.maxIteration = 100 --学習回数
trainer:train(dataset)

x = torch.Tensor(2)
x[1] =  0.5; x[2] =  0.5; print(model:forward(x))
x[1] =  0.5; x[2] = -0.5; print(model:forward(x))
x[1] = -0.5; x[2] =  0.5; print(model:forward(x))
x[1] = -0.5; x[2] = -0.5; print(model:forward(x))

Torch7 のインストール

皆さんこんにちは
お元気ですか。私は元気です。

Facebookが一部をオープンソースにしたとかで、最近話題のTorch7について記載してみた。

Torch7とは?

http://torch.ch/:enable

科学技術計算の為の、機械学習ライブラリで、LuaJITで動作します。
CUDAなどのGPUについても実装されています。

Install

公式ホームページ通りで基本は問題ありませんが一箇所だけ変更しておいたほうが良い箇所があります。

curl -sk https://raw.githubusercontent.com/torch/ezinstall/master/install-deps | bash
git clone https://github.com/torch/distro.git ~/torch --recursive
cd ~/torch; ./install.sh

私の時はhomebrewが仕事をしていました。
最初のは、依存パッケージのインストールを行い、次のスクリプトはLuaに関するスクリプトが走ります。

次にパスを記載します。パスについては公式とは別の方法を取る方が良いです。
起動時にprofileを読み込まないので、bash_profileに以下の文を記述します。

export PATH=~/torch/bin:$PATH; export LD_LIBRARY_PATH=~/torch/lib:$LD_LIBRARY_PATH;

そして読み込みでsourceを使います。

source ~/.bash_profile

インストール確認の為に一度実行してみましょう。以下の通りであれば問題ありません。

$th

  ______             __   |  Torch7
 /_  __/__  ________/ /   |  Scientific computing for Lua.
  / / / _ \/ __/ __/ _ \  |
 /_/  \___/_/  \__/_//_/  |  https://github.com/torch
                          |  http://torch.ch

因みにgitで手に入れたtorchが邪魔であれば、以下のコマンドを実行してください。

rm -rf ~/torch

パッケージ管理

Pythonのpip,Rubyのgemのようにluaにもluarocksを用いて、パッケージ管理を行うことができます。

試しに公式でインストールしているimageを例にするとこんな感じでインストールすることができます。

luarocks install image

インストールされているパッケージを確認したい場合はlistを引くと、簡単に調べることができます。

luarocks list

起動してから以下のように記載し、特に問題がなければ大丈夫です。

th> require 'image'
true

わからない時は

Cheatsheetのリンクが妙に充実しているのでこれ見れば大抵のことはわかります。
Cheatsheet · torch/torch7 Wiki · GitHub