シリコンバレーで暮らし始めました
あけましておめでとうございます.
昨年は婚約,卒業,就職と激動の1年でした.
本年はさらに激動の年になる予感がしますが,宜しくお願いいたします.
博士課程を卒業後,10月からシリコンバレーにて某検索最大手のResearch部門で働き始めました.仕事を始めたばかりの頃は大変に思うことも多々ありましたが,努力の甲斐もあり少しずつ成果も出始めて,徐々に環境にも慣れてきたところです.
アメリカで働くのは本当に英語が不利になるので,わたしにとっては非常に厳しい環境なのですが,日々成長を感じています.
英語といえば,この国は英語が喋れない人に対して非常に厳しい.
可愛い女の子だと対応が違うことは最近分かったのですが,わたしのような残念な男子に対しては非常に厳しい.
何度か聞き返せば問題ないレベルで意思の疎通がはかれたとしても,完璧に喋れないと分かるやいなや悲しい目で見られます.
これは慣れるしか無いですし,喋れないのが悪いので精進あるのみです.
わたしは苫小牧工業高等専門学校から豊橋技術科学大学に編入し,博士課程まで至ったクラスタです.
わたしは高専時代は暗黒でしたが,豊橋技術科学大学―TUTに入学してから人生が好転し始めて非常に素晴らしい日々を過ごすことが出来たので,TUTには非常に強い思い入れがあります.
なので,今後TUTの発展を何かしらの形でお手伝い出来たらと思ったりします.
ともあれ,2013年を素晴らしい年にするために頑張って行きたいと思います.
それではまた.
EmacsでC++のnamespaceを挿入する.
他にもっと良い方法があるのかもしれませんが,EmacsでC++のnamespaceを挿入するelispを書いてみたら中々良かったので,誰かの役に立つかもしれないし載せておきます.
(defun insert-namespace (name) "Insert namespace" (interactive "sname : ") (insert (format "namespace %s {\n\n} // namespace %s" name name)) (previous-line))
わたしはこれを以下のようにしてC-c nに割り付けて使っています.
(add-hook 'c-mode-common-hook '(lambda () (local-set-key "\C-cn" 'insert-namespace)))
また,まったく関係ないですが,ff-find-related-fileというヘッダとソースのバッファを入れ替えてくれるコマンドが激しく便利です.
わたしはこれをC-c oに割り付けて使っています.
(add-hook 'c-mode-common-hook '(lambda () (local-set-key "\C-co" 'ff-find-related-file)))
Protocol Buffersで大きなモデルを読み込む
最近,モデルの読み書きには Protocol Buffersを使っている.
複雑な構造を持つデータを扱ってそれを読み書きするようなプログラムを書くときに一番ダルいI/Oを書かなくて済むのと,バイナリで保存してくれるので記憶容量も少なくて済むところが良い.
普通に使う限りだと,
void read_model(const std::string& model_file, ::google::protobuf::Message* msg) { ifstream is(model_file.c_str(), ios::binary); if (!msg->ParseFromIstream(&is)) { // エラー処理 } } void write_model(const ::google::protobuf::Message* msg, const std::string& model_file) { ofstream os(model_file.c_str(), ios_base::binary | ios_base::trunc); if (!msg->SerializeToOstream(&os)) { // エラー処理 } }
てな感じに書くだけでI/Oが出来てしまうので素晴らしい.
普通に使う分には素晴らしいProtocol Buffersであるが,扱えるファイル(message)のサイズに制限があり,デフォルトでは32MBを超えた時点で警告,64MBを超えた時点でエラーとなってしまう.
わたしが最近遊んでいるような音声認識のモデルだと,楽勝でこのサイズを超えてしまうので工夫が必要になる.
サイズの制限を外す方法は
google/protobuf/io/coded_stream.h
の
void SetTotalBytesLimit(int total_bytes_limit, int warning_threshold);
の宣言の上辺りに以下のように書いてある.
// Hint: If you are reading this because your program is printing a // warning about dangerously large protocol messages, you may be // confused about what to do next. The best option is to change your // design such that excessively large messages are not necessary. // For example, try to design file formats to consist of many small // messages rather than a single large one. If this is infeasible, // you will need to increase the limit. Chances are, though, that // your code never constructs a CodedInputStream on which the limit // can be set. You probably parse messages by calling things like // Message::ParseFromString(). In this case, you will need to change // your code to instead construct some sort of ZeroCopyInputStream // (e.g. an ArrayInputStream), construct a CodedInputStream around // that, then call Message::ParseFromCodedStream() instead. Then // you can adjust the limit. Yes, it's more work, but you're doing // something unusual.
要は普通じゃない使い方だけど,どうしてもというなら方法はあるということだが,色々調べるのがダルかったのでまとめておきます.
以下の様に書くと上手くいった.
void read_model(const std::string& model_file, ::google::protobuf::Message* msg) { namespace gpio = ::google::protobuf::io; int fd = open(model_file.c_str(), O_RDONLY); gpio::ZeroCopyInputStream* raw_input = new gpio::FileInputStream(fd); gpio::CodedInputStream* coded_input = new gpio::CodedInputStream(raw_input); coded_input->SetTotalBytesLimit(INT_MAX, INT_MAX); if (!msg->ParseFromCodedStream(coded_input)) { // エラー処理 } delete coded_input; delete raw_input; close(fd); }
書き込みの方は特に変更は必要なかった.
あんまり必要になる人はいないだろうが..
zshの区切り文字を変更する
zshでC-wを押すと区切り文字まで削除してくれるわけですが,デフォルトの設定だと'+'が区切り文字になっていて,corpus1+corpus2 みたいなディレクトリを扱うときにいつも発狂していました.
これは辛抱ならんということで,ちょろっとぐぐってみたら一瞬で解決しますた.
具体的には,環境変数WORCHARSを以下のように設定しました.
export WORDCHARS="*?_-.[]~=/&;!#$%^(){}<>+"
デフォルトに'+'を追加しただけ.
WORDCHARSは区切り文字と見なさない記号のリストだそうです.
デフォルトがどうなってるかはechoでもして調べましょう.
追記
なんかみんな'/'消してるけどあった方がいいじゃんと思ってたんですが,取ってみるとかなり便利ですね.
ということで結局こうした.
export WORDCHARS="*?_-.[]~=&;!#$%^(){}<>+"
GPUマシンの設定で嵌った
昨日,研究用にGPUマシンを導入するためにマシンの設定を行っていたのだが,どうにもうまくいかなかった.
ドライバとかライブラリはちゃんとコンパイル出来てるっぽいんだけど,CUDA SDKのサンプルがうまく実行できないという.
C/ の下に入っているのはうまくいったんだけど,CUDALibraries/ の方が初期化処理でとまってしまう謎.
色々原因を追求していくと,NISユーザではうまくいかないけれど,何故かローカルユーザではうまくいくことを発見した.
NISユーザとローカルユーザで違うところは,ユーザ情報をNISで引いていることとhomeディレクトリがNFSマウントかローカルかというあたり.
ユーザ名,ユーザID,グループIDをまったく同一にしたユーザを作ってサンプルを動かしてみたら無事動いたので,どうやらNFSマウントしたホームディレクトリに問題がありそうということに.
それで頑張って調べていたら,以下の環境変数を見つけた.
CUDA_CACHE_DISABLE=1
これを設定すると何故かうまくいきだたしました.
同じことで悩んでいる人がもしかしたらいるかもしれないのでメモしておく.
あけました
あけましておめでとうございます.
今年も宜しくお願いします.
某SNSでも書いたのですが,こっちにも書きます.
今年の目標は以下の通りです.
1. 卒業要件を満たす
これ大事.博士課程というところは何年通えば卒業とかそういうわけではないので大変です.頑張るしか無い.しかも私は訳あって短縮卒業を目指しているのでより大変です(ジャーナル4本).実際短縮はもう無理なんじゃねえか(D2半分で1本).
2. 就職をキメる
ついに私も学生を終える時が近づいてまいりました.博士は就職が大変(といわれている)なのでニートにならないように頑張りたい.理系なので大丈夫とは思いますが.興味がある会社は多数.ポストがあればアカデミアも検討したい.とある総長賞の方と働いてみたいということで某社にも興味がある. 音声認識に関しては技術はあるので,ベンチャーを起こすというのも悪くないかなとか(夢見過ぎですねすいません.でも一緒に誰かやりませんか?目標は勿論Nuanceに買収されて巨万の富を築くことですw)
3. 健康になる
メタボがひどいのでなんとかしたい.ランニングを始めたら速攻で足にイボが出来たのでやめてしまった.学校に自転車で行くと晩飯を食いに行けないので困るし悩むところである.今の研究室の車の持ってなさは異常である.
4. 財政状況を改善する
未来への投資だ!とかいって無計画な消費をしてクレジット破産しかけていましたが,なんとか回復してきました.ニコニコ現金払いが目標です.
5. 留学する
これはおそらく再来年度になりそうではあるが,今年できたら今年にしたいなーとか.DC2通ったらしいのでロスタイムで行くのが一番良さそうなのでやっぱり再来年度かなぁ.というか学振で留学って出来るんですか?やるやる詐欺にならないように注意したい
6. 社会貢献する
なんだかんだで色々と作ったものがあるので,これを公開することで社会に貢献したい.バグレポだけではね.地味にこういうの公開したりしてます.研究に関係するやつだと論文誌に出すまでは公開しにくい.CNFとか話し言葉用係り受け解析器とか.
7. 英語上達
例えばTOEICで800点くらいを目指すとか.実際800点でも全然不自由でしょうが. この前受けたのがどのくらいかわかりませんが,博士の学生なら800点くらいは欲しいのかなとか
8. 日本語上達
最近,自分が日本語に不自由であることを自覚してきたので,KAGEROUでも読んで日本語の勉強したい
9. ITに強くなる
情報系なのに最新のITサービスに疎いのでなんともなりません.同僚のC氏を見習ってITに強くなりたい
10. 帰省する
ついに親が帰ってこいと言い出したので,帰りたい.クッパ城にも乗り込まねばならない.せっかく帰るなら皆がいるときがいいので,盆かなあと思っている.そのためにはスタッフ作業を後輩にやらせるように指導しなければいけません.
無理くり搾り出した感がいなめない10の目標でした.
色々手を出しすぎて昨年は俺の専門はなんなんだと悩んだこともありましたが,普通に音声言語処理だなということに気付きました.音声言語処理の中のなんなのかと言われると苦しいですけどね.要約,整形,デコーダ,識別モデルとやり散らかしているので.
今年も宜しくお願いします.