2017/12/10

CentOS 7 上に CUDA 9 環境を構築する

CentOS7 上に CUDA 9 を入れることがあったのでそのメモ。


環境

  • OS: CentOS Linux release 7.4.1708 (Core)
  • CUDA: 9.0
  • GPU: Nvidia GTX 1070


GPU を認識しているか確認

CentOS 側が GPU を認識しているかどうかは
  • lspci
などで分かります。出力の中にGPUの名前があればOK。


CUDA のインストール

ドライバは入っているものとします。というか特殊なGPUで以外 xorg-x11-drv-nvidia-libs などを入れると動いたり。
この辺は試行錯誤したので minimal な手順が残ってなかったり……。
ということでドライバ周りは飛ばして、CUDA のインストールをします。

まずは NVIDIA の公式サイトから、CUDA をダウンロードします。ここのページでOSやバージョンを選んでいく。
今回は Linux + x86_64 + RHEL + 7 + rpm(network) を使います。

後は出てきたコマンドに従うだけ。
  • wget http://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-repo-rhel7-9.0.176-1.x86_64.rpm
  • sudo rpm -i cuda-repo-rhel7-9.0.176-1.x86_64.rpm
  • sudo yum clean all
  • sudo yum install -y cuda
rpm(network) だと、インストールの際に依存パッケージも入るので、これでおしまい。
1G とか降ってくるので、コマンドは短かくても結構時間がかかったりします。

なお、記事を書いている時点(2017/12/10) では 7.5, 8.0 も入れることができます。
具体的には
  • $ sudo yum install -y cuda-8-0
のようにバージョンを指定してあげるとOK。
バージョンを省略すると最新の CUDA が入ります。

/usr/local/cuda 以下にいろいろと入るので、PATH などを設定します。具体的には
CUDA_ROOT_DIR="/usr/local/cuda"
export CUDA_ROOT_DIR
PATH="$PATH:${CUDA_ROOT_DIR}/bin"
export PATH
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${CUDA_ROOT_DIR}/lib64/"
export LD_LIBRARY_PATH
view raw .zshrc hosted with ❤ by GitHub

などですね。


GPU が動いてるか確認

  • $ nvidia-smi
あたりでGPUの状態が分かります。結果は
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.90 Driver Version: 384.90 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 1070 Off | 00000000:01:00.0 On | N/A |
| 45% 67C P2 81W / 151W | 5922MiB / 8108MiB | 100% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 18309 C hogehoge 5855MiB |
+-----------------------------------------------------------------------------+
view raw nvidia-smi.txt hosted with ❤ by GitHub

のように出力されます。この場合GPUの使用率は100%なので、かなり頑張っていますね。


参考

2017/12/05

AMD OpenCL が wget できなくて困った話

環境

  • OS: CentOS Linux release 7.4.1708(No GUI)
  • AMD OpenCL: 2.0
  • fglrx: 14.41
  • GPU: Radeon HD 5770


OpenCL を wget したい

さて、こんな構成のマシンでGPU使ってみるかー、と思って作業。
X とかは入れていないので GUI は無し。
んで、公式サイトから URL を取得して wget する。
  • $ wget  https://www2.ati.com/drivers/linux-amd-14.41rc1-opencl2-sep19.zip
一瞬で終わったが unzip できない
中身を見ると「ダウンロード中」みたいな html になっている。勘弁してくれ。

困っている人は他にもいて、--referer オプションを付けると良いよ、と。ということで
  • wget --referer='https://www2.ati.com' https://www2.ati.com/drivers/linux-amd-14.41rc1-opencl2-sep19.zip
としたらダウンロードできた。やったね。


参考

2017/12/03

Ruby を使って Kobo の情報を取得する #okinawarb

この記事は Okinawa.rb Advent Calendar 2017 3日目の記事です。
2日目は @_atton さんの「amazon-ecs を使って Kindle マンガの情報を取得する」でした。
というか私ですね。連投です。


経緯

しかし Amazon Advertising API の利用は却下されてしまいました。
取ってしまったドメインを何とか活用しようと思ったログです。


どうして kobo なのか

当初は BookWalker か honto あたりで同じことをする予定でした。
しかし BookWalker ではそれらしきものは無し。
honto は完全に更地でした(これが本家かは不明)。
ということで両方とも無理。

困っていたら本関連のAPI まとめを発見。
軽く見ていると、リンクは辿れませんが楽天のAPIがあります。
楽天と言えば kobo があることを思いだす。

なので kobo の API が無いかなー、と思って探すとありました
ドメイン取っちゃったし、何らかのコンテンツを提供するために使うことにしました。


Rakuten Developers 登録

Amazon Advertising API と同様にまずは token を手に入れるところから。
developer 向けページでアカウントを作成。
New App で Application を作ります。なんだか Twitter みたいですね。
そうしたら
  • (Application|Developer) ID
  • application secret
  • Affiliate ID
が発行されます。
これらのパラメタを使ってリクエストを組み立てることになります。


厚い無料本の山

API endpoint は https://app.rakuten.co.jp/services/api/Kobo/EbookSearch/20170426 です。
これに対して post すれば情報が手に入る。
日付が入ってるのが気になる。リリース日とかなのだろうけれど。
詳細は楽天Kobo電子書籍検索APIにありますが、いくつかの条件を付与可能。

無料本は sort='+itemPrice' とかすると出てくるので問題は無い。
しかし、 minimum_price 相当が無いっぽい。これは痛い。
加えて、kobo には大量の本が登録されているので、sort='+itemPrice' とかしてると有料の本まで取得できない。
具体的には 30 * 10 とかしても無料のものばかり。
分冊版とかおためし版とか青空文庫があるのが原因な気もします。

その辺をフィルタすると50冊くらいにになる。が、無料のものしか無いのは変わらず。
頭が痛い例としては、ユーザアンケート調査が本として登録されているとか。

無料本の何が問題かと言うと、報酬面。
アフィリエイトは有料本を買ってもらわないと報酬が発生しないので、無料本を買って貰っても報酬ゼロ。
なのでマネタイズができない。困った。
結局 ebook-comic.info のドメインは取ったものの、どうしようかは考え中です。
何かアイデアあればください。


ドキュメントについて

ちなみに、ドキュメントは Kobo の方が断然良い。
実際、誰かのブログを見ずに公式ドキュメントだけでリクエストを作れた。
Amazon Advertising API は微妙で、まずドキュメントはログインしないと見られない。
その上、ドキュメントの記述とレスポンスが違ったりする。つらい。
大抵 body にエラーが書いてあるので読めば問題は対処は可能ですが。


リクエストのサンプルコード

なお、koboのリクエスト例はこんな感じ。
API_END_POINT = 'https://app.rakuten.co.jp/services/api/Kobo/EbookSearch/20170426'
APPLICATION_ID = 'hoge'
AFFILIATE_ID = 'fuga'
ElementInformations = ['largeImageUrl', 'title', 'affiliateUrl', 'itemPrice', 'publisherName']
DefaultOpts = {affiliateId: AFFILIATE_ID,
applicationId: APPLICATION_ID,
elements: ElementInformations.join(','),
formatVersion: 2,
field: 0,
hits: 30,
koboGenreId: 101,
language: 'JA',
salesType: 0,
sort: '+itemPrice'}
def post hash
uri = URI.parse(API_END_POINT)
https = Net::HTTP.new(uri.host, 443)
https.use_ssl = true
path = uri.path
path += '?'
path += URI.encode_www_form(DefaultOpts.merge(hash))
request = Net::HTTP::Post.new(path)
https.request(request)
end
post(1) # request 1 page
view raw kobo.rb hosted with ❤ by GitHub
1リクエストで30個(Amazonは10個)取れたりと都合が良いところも多いのです。
しかし、私の周辺では kobo を使っている人を見たことがない……


まとめ

とりあえず無料本を取得するところまではできました。
しかし affiliate の収入が絶望的なので使わない気もする。

ということで Okinawa.rb Advent Calendar 3日目の記事でした。
なお、クリスマスプレゼントはこちらで募集しています。よろしくね。

明日の担当は @_simanman さんです。


環境

  • OS: Ubuntu 16.04.3 LTS 
  • ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]


参考

2017/12/02

amazon-ecs を使って Kindle マンガの情報を取得する #okinawarb

この記事は Okinawa.rb Advent Calendar 2017 2日目の記事です。
1日目は @hanachin さんの「Rubyで国民健康保険料を計算する」でした。

Amazon は Product Advertising API というものを提供していて、商品を検索したりできます。
利用するためには affiliate.amazon.co.jp への登録が必要です。
加えて、 Advertising API を使うサイトなども申請する必要があります。
ちなみに登録に関してはにはこちらの記事が有用です。

Product Advertising API の token を取得したので、いざ商品検索。
具体的にはこちらを参考にしつつ書き始めましたが、この記事では商品検索リクエスト(item_search)を使っています。
私は検索ではなく「特定の値段以下のKindle本」が欲しいので、send_request で直接リクエストを作ることにしました。

とは言え実行するアクションは「ItemSearch」なので検索に相当します。
なお、 Advertising API は「特定のノード以下の情報を検索」ができます。
browse_node: 2293143051 というマジックナンバーがそれです。
2293143051 は Kindle book store のノードのようです。
Amazon本家のサイトの「Kindle ストア」にカーソルを合わせたりすると URL に含まれていて、他にも大量にあります

さて、リクエストの目星が付いたので実行してみましょう。
require 'amazon/ecs'
Amazon::Ecs.configure do |options|
options[:subscription_id] = options[:AWS_access_key_id] = 'hoge'
options[:AWS_secret_key] = 'fuga'
options[:associate_tag] = 'piyo'
end
result = Amazon::Ecs.send_request({response_group: 'Images,ItemAttributes,Large',
operation: 'ItemSearch',
browse_node: '2293143051',
minimum_price: 0,
maximum_price: 0,
search_index: 'Books'})
view raw request.rb hosted with ❤ by GitHub
あれ。取れていませんね。何故だろう。

デバッグのために request を inspect したりして request の URI を取得。
その上参考記事の URI と比較すると、どうやら amazon.com に request を送っているようです。
(ここはエラーの詳細を書きたかったのですが、BANされたので割愛)
ということで marketplace: 'ja' を追加すると amazon.co.jp にリクエストを送るようになりました。
result = Amazon::Ecs.send_request({response_group: 'Images,ItemAttributes,Large',
operation: 'ItemSearch',
browse_node: '2293143051',
minimum_price: 0,
maximum_price: 0,
search_index: 'Books'
marketplace: 'jp'})
# return items
view raw fix_request.rb hosted with ❤ by GitHub
これで無料の Kindle 本を取得できました。


まとめ

amazon-ecs を使って無料の Kindle 本を集めることができました。
私はやってないのですが、これを購入する部分まで書くと素敵なことになりそうですね。

ということで Okinawa.rb Advent Calendar 2日目の記事でした。
なお、クリスマスプレゼントはこちらで募集しています。
明日の担当は @_atton さんです。というか私です。そして3日目の記事はこちら


環境

  • OS: Ubuntu 16.04.3 LTS 
  • ruby: 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]
  • rubygems: 2.6.13
  • amazon-ecs: 2.5.0


参考