記事一覧表示

AI Platform notebookのインスタンス上のファイルをダウンロードする話

インスタンスでエラーが出て、インスタンス内にログイン出来なくなった場合、インスタンス内のファイル・フォルダをどうやって取ってくるかって話。
GCSDKを自分のパソコンにインストールしている場合は、

% gcloud compute scp インスタンス名:取ってきたいファイルorフォルダまでのパス ./ [--recurse]

で良いらしい。
--recurse は、取ってきたい物がフォルダだった時に付けるオプション。
ただ、容量が大きい物を gcloud compute scp コマンドで取ってくると、凄く時間が掛かってしまうので、プロジェクト内にバケットとして保存しておくと後で楽にダウンロード出来る。
バケットの作り方は、インスタンス内でターミナルを開いて、

$ gsutil -m cp [-r] バケットにしたいファイルorフォルダまでのパス gs://プロジェクト名

を実行。
-r は、バケットにしたい物がフォルダだった時に付けるオプション。
-m は、バケットにしたい物の容量が大きい場合に付けるオプション。
因みにプロジェクト内のバケットは、

Google Cloud Platformのトップページ -> 左上のメニュー -> Storage -> ブラウザ -> プロジェクト名

の順で入ったページ上で管理できる。

AI Platform notebookにmecab-ipadic-NEologdを入れた話

mecab-ipadic-NEologdの公式githubUbuntuの場合を参考に、必要ツールを入手。
 
python上で使いたかったので、mecab-pythonMeCabモジュール)をpipで入れようとしたら、以下のエラーが。。。

$ pip install mecab-python
Collecting mecab-python
  Using cached mecab-python-0.996.tar.gz (40 kB)
    ERROR: Command errored out with exit status 1:
     command: /opt/conda/bin/python3.7 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-izvssij1/mecab-python/setup.py'"'"'; …
         ・
         ・
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-izvssij1/mecab-python/setup.py", line 18, in <module>
        include_dirs=cmd2("mecab-config --inc-dir"),
      File "/tmp/pip-install-izvssij1/mecab-python/setup.py", line 10, in cmd2
        return string.split (cmd1(str))
    AttributeError: module 'string' has no attribute 'split'

調べると、mecab-pythonのsetupツールがpython3に対応してないらしく、リンク先のページ通りにmecab-pythonのビルドツールをダウンロードし、setup.pyを書き換え、ビルドしたら通った。
また、MeCabモジュール上で、NEologd辞書を指定するために、

$ echo `mecab-config --dicdir`"/mecab-ipadic-neologd"

で辞書のパスを調べ、pythonコードで、

import Mecab

mecab = MeCab.Tagger('-d NEologd辞書へのパス’)
res = mecab.parse(‘解析したい文章’)

とするらしい。

TPUEstimatorのログを消した話

公開されている事前学習済みBERTを持ってきて、notebook上で公式の通りに動かしているんですが、fine-tuning中に「ログが多すぎて、これ以上表示できない」みたいなエラーで止まっしまった。
表示されているログを見ると、

I0229 11:37:52.823160 140695538263808 tpu_estimator.py:2307] global_step/sec: 0.193832
INFO:tensorflow:examples/sec: 1.55065
I0229 11:37:52.824455 140695538263808 tpu_estimator.py:2308] examples/sec: 1.55065
INFO:tensorflow:global_step/sec: 5.84653

みたいなログが、step(batch)毎に表示されていた。
まあ、多分、step(batch)毎の学習時間を表示しているだけなので、消しても問題ないはず。
上記のログを見ると tpu_estimator.py の2307行目と2308行目でメッセージが出てるっぽいので、ターミナルでファイル tpu_estimator.py を検索。

$ sudo find / -name tpu_estimator.py | xargs -I {} wc {}
  33  169 1851 /home/jupyter/src/tensorflow/tensorflow/contrib/tpu/python/tpu/tpu_estimator.py
             ・
             ・
  4422  15483 179695 /usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/tpu/tpu_estimator.py
             ・
             ・
  4422  15483 179695 /usr/local/lib/python3.5/dist-packages/tensorflow_estimator/python/estimator/tpu/tpu_estimator.py
  33  169 1851 /usr/local/lib/python3.5/dist-packages/tensorflow_core/contrib/tpu/python/tpu/tpu_estimator.py
  33  169 1851 /usr/local/lib/python3.5/dist-packages/tensorflow_core/python/tpu/tpu_estimator.py

python3で動かしてた(てか、python2にもtensorflowあるのか)ので /usr/local/lib/python3.5/dist-packages/tensorflow_estimator/python/estimator/tpu/tpu_estimator.py だと推定。
このファイルの2307行目と2308行目を以下のようにコメントアウト

    #logging.info('global_step/sec: %g', global_step_per_sec)              
    #logging.info('examples/sec: %g', examples_per_sec)

これでログが消えた。

AI Platform notebookのOSを調べる話

最近、Google Cloud PlatformのAI Platform notebookを触る機会があり、インスタンス内の環境構築でツール入れる為に、OSを知りたくなって、 方法を調べたら、

$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

だった。 ひとまず、Linux系らしい。
調べたらUbuntuと同じ系統(Debian GNU/Linux)っぽい。

seaborn.distplot()を使ったらFutureWarningを吐かれた話

 seabornのdistplot()関数を使った時に以下のようなWarningを吐かれた。

***/scipy/stats/stats.py: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval

 「予期しない動作とかエラーを吐く可能性があるからstats.pyに入れるarrayのindexはtupleを使用して欲しい」とかそんな感じの事が書いてあるけど、正直良く分からん…
 調べてみるseaborn.distplot は、裏で scipy.stats を呼び出していて、そこでWarningを吐くんだけど、解決策が

For python>=3.7 you need to upgrade your scipy>=1.2.

だったので、ひとまず、

% conda update conda
% conda update --all

でconda内のパッケージをアップデートしたら直りました。
技術者の方に感謝m(_ _)m

anyenv経由のconda環境を全部削除した話

 約一年前にanacondaをpyenv(anyenv)経由で入れたんですが、conda経由で入れたパッケージのパスが良く分からない事になってしまった(多分pipと混同したんだと思う)ので、全部ぶっ壊して入れ直そうと思います。正直、これでやり方合ってるのか分からなかったので、記録。

condaを削除

 % pyenv versions を頼りに、anaconda環境に pyenv global 環境名 で切り替えて、このページを頼りに以下のコマンド実行。

% conda install anaconda-clean
% anaconda-clean

pyenv上のconda環境を削除

 % pyenv versions を頼りに、anaconda環境を以下のコマンドで削除。

% pyenv uninstall 環境名

再度anacondaをインストール

 % pyenv install --list から最新のanaconda3を以下のコマンドで入れる。

% pyenv install anaconda3-最新バージョン

 まあ、まだ全然使ってなかったので、ダメージ少なくて良かったか。皆もパッケージ管理ツールの混同には気をつけようね(´;ω;`)

localhostを開こうとしたらForbiddenエラーを吐かれた話

 久しぶり(5〜6年前位ぶり?)にMacBookAir(10.13.6 HighSierra)で http://localhost/ を開こうとしたら、以下のようなエラーが出た。

Forbidden

You don't have permission to access / on this server.

 権限が無いとか書いてあるので、ひとまず、設定ファイル(httpd.conf)にエラーが無いかを確かめる為に以下のコマンドを実行。

% apachectl configtest
AH00112: Warning: DocumentRoot [/usr/docs/dummy-host.example.com] does not exist
AH00112: Warning: DocumentRoot [/usr/docs/dummy-host2.example.com] does not exist
Syntax OK

 DocumentRoot /usr/docs/dummy-host2.example.com が無いって言ってるから、それを呼び込んでいるファイルを /private/etc/apache2 から探してみる。

/private/etc/apache2% grep -r "/usr/docs/dummy-host2.example.com" ./*
        ︙
./extra/httpd-vhosts.conf:    DocumentRoot "/usr/docs/dummy-host2.example.com"
        ︙

 調べてみるとhttpd-vhosts.confは、仮想ホストの設定を行っているファイルらしい1
 書き方2を調べてhttpd-vhosts.confを以下のように書き換えた。

     ︙
#<VirtualHost *:80>                                                                    
#    ServerAdmin webmaster@dummy-host.example.com                                      
#    DocumentRoot "/usr/docs/dummy-host.example.com"                                   
#    ServerName dummy-host.example.com                                                 
#    ServerAlias www.dummy-host.example.com                                            
#    ErrorLog "/private/var/log/apache2/dummy-host.example.com-error_log"              
#    CustomLog "/private/var/log/apache2/dummy-host.example.com-access_log" common     
#</VirtualHost>                                                                        
#                                                                                      
#<VirtualHost *:80>                                                                    
#    ServerAdmin webmaster@dummy-host2.example.com                                     
#    DocumentRoot "/usr/docs/dummy-host2.example.com"                                  
#    ServerName dummy-host2.example.com                                                
#    ErrorLog "/private/var/log/apache2/dummy-host2.example.com-error_log"             
#    CustomLog "/private/var/log/apache2/dummy-host2.example.com-access_log" common    
#</VirtualHost>                                                                        

<VirtualHost *:80>
   ServerName localhost
   DocumentRoot /Users/username/Sites
</VirtualHost>

 要らない設定(仮想ホスト dummy-host.example.comdummy-host2.example.com )をコメントアウトし、新しくlocalhostを設定。
 sudo apachectl restart したら無事に動いた。
 うーん、こんな設定した覚え全く無いけど、前(5〜6年程前)動いてた時は、標準で設定してくれてたのか?OSのバージョンアップで知らない内に無くなってしまったのか?謎だ…


  1. このページを参照。

  2. このページを参照。