Chainerを1.5にアップグレードするのにやったこと


Chainerが先日v1.5になりました。
こちらにも書かれていますが、依存関係などが変わっているので、少しアップグレードにつまづいたので、主にHDF5関連でやったことを記述しておきます。

[Chainer 1.5のインストールがうまくいかない人への非公式なTips](http://qiita.com/unnonouno/items/c491b6df59352159cbf0)

# Ubuntuの場合
手元のローカル環境のものです。
これだけでした。

```
$ sudo apt-get install libhdf5-dev
$ sudo pip install --upgrade chainer
```

# Amazon Linuxの場合

[こちら](http://sla.hatenablog.com/entry/chainer_on_ec2)を参考にAWSで立ち上げているインスタンスのものです。

```
$sudo yum install hdf5
```

でHDF5をインストールしようと試みたのですが、

```
$ sudo yum install hdf5
読み込んだプラグイン:dkms-build-requires, priorities, update-motd, upgrade-helper
amzn-graphics/latest                                     | 2.1 kB     00:00     
amzn-main/latest                                         | 2.1 kB     00:00     
amzn-updates/latest                                      | 2.3 kB     00:00     
2 packages excluded due to repository priority protections
パッケージ hdf5 は利用できません。
エラー: 何もしません
```

こんなエラーが出て、インストールできません。
どうやらパッケージに優先度が設定されており、特定のパッケージがHDF5のものより高く設定されており、できない模様です。こちらに変更の方法等が書いてありましたが、優先度を変更して他に影響があると困るので、怖くてできません。

[CentOS yum　メッセージ  packages excluded due to repository priority protections](http://www.fwoabw.info/entry/2013/12/25/130219)

そこで、ソースから取ってきてビルドします。

[こちら](https://www.hdfgroup.org/HDF5/release/obtainsrc.html)からlinux用のソースを取ってきます。

```
$ wget http://www.hdfgroup.org/ftp/HDF5/current/src/hdf5-1.8.16.tar
$ tar xvf hdf5-1.8.16.tar
$ cd hdf5-1.8.16.tar
$ ./configure --prefix=/usr/local/hdf5 --enable-fortran --enable-cxx
$ make -j8
$ make -j8 check
$ sudo make install
$ sudo make check-install
```

.bash_profileに環境変数を記述  

```bash:.bash_profile
export HDF5_DIR=/usr/local/hdf5
```

この状態でchainerアップグレード
```
$ pip install --user --upgrade chainer
```

これでなんとかアップグレード成功しました。

しかしimagenetの実行でこんなエラーが

```
Traceback (most recent call last):
  File "./train_imagenet.py", line 317, in <module>
    train_loop()
  File "./train_imagenet.py", line 286, in train_loop
    serializers.save_hdf5(args.out, model)
  File "/home/ec2-user/.local/lib/python2.7/site-packages/chainer/serializers/hdf5.py", line 61, in save_hdf5
    s.save(obj)
  File "/home/ec2-user/.local/lib/python2.7/site-packages/chainer/serializer.py", line 64, in save
    obj.serialize(self)
  File "/home/ec2-user/.local/lib/python2.7/site-packages/chainer/link.py", line 546, in serialize
    d[name].serialize(serializer[name])
  File "/home/ec2-user/.local/lib/python2.7/site-packages/chainer/link.py", line 691, in serialize
    child.serialize(serializer['%d' % idx])
  File "/home/ec2-user/.local/lib/python2.7/site-packages/chainer/link.py", line 345, in serialize
    serializer(name, d[name].data)
  File "/home/ec2-user/.local/lib/python2.7/site-packages/chainer/serializers/hdf5.py", line 41, in __call__
    self.group.create_dataset(key, data=arr, compression=compression)
  File "/home/ec2-user/.local/lib/python2.7/site-packages/h5py/_hl/group.py", line 103, in create_dataset
    dsid = dataset.make_new_dset(self, shape, dtype, data, **kwds)
  File "/home/ec2-user/.local/lib/python2.7/site-packages/h5py/_hl/dataset.py", line 107, in make_new_dset
    shuffle, fletcher32, maxshape, scaleoffset)
  File "/home/ec2-user/.local/lib/python2.7/site-packages/h5py/_hl/filters.py", line 109, in generate_dcpl
    raise ValueError('Compression filter "%s" is unavailable' % compression)
ValueError: Compression filter "gzip" is unavailable
```

なんかgzipで圧縮しようとして、gzipのフィルターが見当たらないと言われる。
いろいろ調べたところ、[HDF5のインストールマニュアル](https://www.hdfgroup.org/ftp/HDF5/current/src/unpacked/release_docs/INSTALL)のzlibのところに  

>
        The HDF5 Library includes a predefined compression filter that 
        uses the "deflate" method for chunked datasets. If zlib-1.1.2 or
        later is found, HDF5 will use it.  Otherwise, HDF5's predefined
        compression method will degenerate to a no-op; the compression
        filter will succeed but the data will not be compressed.  

とあった。簡単に訳せば、zlibが入ってないと、ビルド時はいいけど圧縮のときに失敗するよ、みたいなことが書いてある。入ってるはずだけど、一応確認。
こちらに確認の方法が書いてあったので、やってみる。

```sh
$ yum list installed|grep zlib
zlib.x86_64 ...
```
ある。だけれど、先のページの結果には、

```sh
$ yum list installed|grep zlib
zlib.x86_64 1.2.3-29.el6 @base
zlib-devel.x86_64 1.2.3-29.el6 @base
```

と、zlibのdevパッケージの存在が確認される。これが必要なんじゃないかと思い、インストール、HDF5とchainerをアンインストール後に再インストール

```sh
$ sudo yum install zlib-devel
$ sudo make uninstall
$ pip uninstall chainer
# 以下先ほどのHDF5インストール手順とchainerインストール
```

これでようやく、学習中にコケることがなくなった。

# 参考

[HDF5公式](https://www.hdfgroup.org/HDF5/release/obtainsrc.html)
[HDF5 Download and Installation](https://www.underworldproject.org/documentation/HDF5Download.html)
[【centOS】zlibをインストールする方法](http://lifeworker.jp/wordpress/how-to-zlib-install.html)