seri::diary

日常

業務でコードを書く機会または時間が得られない場合の対処法について

これは何か

  • ソフトウェアエンジニア職(マネージャ職は含まない)として雇用されているにも関わらず,様々な理由で業務としてプログラミングができない状況に陥る期間がまれに存在する.
  • 本エントリでは筆者が考えた対処法を記す.

コードが書けない状況

  • 機会がない
    • 関わっているプロジェクトが何らかの要因により停滞しておりコードを書く必要のあるタスクが発生しない.リファクタリングやライブラリのバージョンアップ等をして時間を潰していたが大体やり尽くしてしまった
  • 時間がない
    • 実装しようとしている機能設計に関する議論が紛糾しており,他メンバーからの懸念を払拭するために検証作業を大量にやらなければいけない
    • documentを大量に書かねばならず,コードを書いてる暇がない
    • project management業を任されており,社内外の調整業務に忙殺されている
    • 大量のミーティングへの出席を要求されており,ミーティングそのものと付随する作業で1日が終わる
    • 日々障害対応に追われて1日が終わる

大雑把な対処法

  • 機会がない
    • 他の同僚のヘルプをしに行く
    • 埋もれているチケットを発掘して勝手にやる
    • CI/CDを改善する*1
    • 重そうなSQLを探して修正するもしくは当該のcolumnにindexを貼る*2
    • typoを探して直す*3
    • コメントの誤字脱字を直す
    • 使われていない定数・関数・クラスを発見して削除する*4
    • 使われていないテーブルを発見して削除する*5
    • 古いsyntaxで書かれている箇所を直す*6
    • コードを読みまくって少しでも気になる所のリファクタリングをする*7
    • プロファイリングしまくってボトルネックを探し出し取り除く*8
    • 「いつか使えると思うっす」とか言ってライブラリを生み出す*9
    • 社内で使っているが自分が気に入らないツールを勝手に置き換える or 書き換える*10
    • Dockerで動いてないものをDocker上で動くようにする
  • 時間がない
    • 誰かとタスクをシェアしてコードを書く余裕を作る
    • 急いで目の前のタスクを終わらせてコードを書く時間を捻出する
    • 自分が不要そうなミーティングは参加を断って出席しない*11
    • 残業してコードを書く時間を捻出する
  • 仕事でコードを書くのを諦める
    • 仕事を急いで終わらせてプライベートでコードを書く時間を最大化する*12
  • その他
    • 直属上司に相談する
    • 直属上司がだめなら上位上司に相談する
    • 他のマネージャに仕事をもらえないか相談する

*1:経験上特にデプロイ周りは改善の余地が多いことが多い

*2:たくさん見つかると無限にやっていられて楽しいしweb applicationのレイテンシ改善効果が高い

*3:英文法の誤りを直してもよい

*4:たくさん消せると気持ちいい

*5:削除して問題が起きると怖いのでリネームして様子を見るだけでもよい

*6:かつてrspec2系で書かれたspecを全部rspec3系のsynctaxに直したことがある

*7:リスクが低いコードから少しずつやる

*8:以外と変なところで重くなっているぞ

*9:前職で暇だった時に2週間かけてJSONを生成する謎のDSLを書いたが誰にも使われなかった

*10:まずは長年メンテされてない社内ツールのような,皆の関心が低いものを狙う

*11:「あいつはそういう奴だ」で許される空気を作ろう

*12:悲しいけどこれが一番楽な気もする

しばらく34,35歳のおっさんである事実を忘れてみる

これはなにか

2020年5月から2022年3月の間は自分が34,35歳のおっさんであることを忘れさせて欲しい件に関するexcuseである.

なぜ忘れる必要があるのか

時々自分の年齢を思い出すと「同年代の友人たちは子育てに忙しい一方で俺は仕事とAtCoderの精進に忙しい.実は相当問題のある生き方をしているのではないか.」と不安になる.その問に対する問答を脳内でシミュレートすると,10 hop程度の問答を経ていつも同じ結論に帰着する.

「褒められた生き方ではないかもしれないが,やりたいことをやって,その結果社会に役に立つoutputをしてお金を稼げるようになりたい」

「今はそれができているか?できていない.だからそうなりたい.」

この結論に1 hopで到達できない理由は自分の年齢である.
自分は2020年4月で34歳になった.2009年4月で会社員になり,その後11年が経過している.その途中2年間は大学院にいたので会社員経験は9年間である.普通,9年もほぼ同じ職種を経験していればもうベテランである.新しくなにかを勉強する機会は少なくなり,それまでの業務経験と全く関係がない仕事をしようとは思わない年齢であると考えている.

例えば,自分で言えばずっとweb application backendをメインで開発してきたので,backend teamのpeople managementをするもよし,web applicationアーキテクトを極めるもよし,frontendやインフラに手を伸ばすもよし,はたまた開発経験と採用活動経験を生かして人事に転向してSWE採用に取り組むもよし. そうやってT字型にスキルを伸ばすのがコスパの良いキャリアアップの仕方だと思う.自分の周囲でもそのようにキャリアを伸ばしてきた元SWEを知っている.なぜなら人間それまで学んだものを捨てて新しい領域に踏み出すためには高いコストが必要である.また,ある程度経験を経ているがゆえの周囲からの期待もある程度は存在している(と思っている).そのため,この年齢になると新しい領域へのチャレンジのコストはどんどん高くなる.

こういった事実により,年齢に反した行動に対して罪悪感のようなものを感じる傾向が自分にはある.しかし人生は本当に残り短い.あと30年も現役でいられればいい方だと思っている.ほんとは以前このブログに書いたように,死ぬその日までSWEでいたい.しかし人生何があるか分からない.例えば自分がいくら健康でも,40歳ぐらいで親の介護のために仕事を諦めて実家に帰らなければならない可能性もある.

serihiro.hatenablog.com

だからまだチャンスがあるうちにやりたいことをやりたい.いや,やりたいことができるように精進する時間を取りたい.これが今の本音である.32歳の時に仕事を辞めて2年間も大学院に行ってた癖に全く懲りていない.むしろ,大学院で研究したことでやりたいことがより明確に見えたという方が正しい.

なぜ忘れさせてほしいのか

競プロが面白くなってきたので本気でAtCoder青を目指したい

atcoder.jp

実はAtCoderにsignupしたのは約3年前の2017年1月である.何を通じてAtCoderにsignupしたのかは覚えていないが,何故かその時期に突然コンテストに参加し始めた.初参加したコンテストはABC053なのだから結構昔だ.しかし,何回かコンテストに参加した後にパッタリと止めてしまっていた.理由は「仕事の役に立つとは思えない」からだった.当時はRailsでweb applicationを書く仕事をしていたが,アルゴリズムを自前実装する機会は「全く」なかった.メモリ使用量や速度について考えるのはせいぜい複雑なSQLを書く時ぐらいで,効率の良いアルゴリズムやデータ構造の実装はすべて言語の標準ライブラリやRDBMSに丸投げしていた.そのぐらい無頓着に書いても問題なく動作する程度のwork loadしかないweb applicationしか書いていなかった.それよりも,コードの保守性,テストの書きやすさ,安全なdeploymentのためのworkflowの設計,マイクロサービス間のインターフェース設計,分かりやすいdocumentationといった事の方がより重要な関心事だった.

それが今やほぼ毎日精進*1しており,多い日は1日に過去問を16問ぐらい解いた日もある.なぜか?単純に楽しいと感じるからである.例えば業務でbit DPを実装して問題を解く機会は未だにない.しかし,新しいアルゴリズムを覚えて問題を解けるようになってコンテストでのパフォーマンスを上げること自体が純粋に楽しい.

f:id:serihiro:20200519185045p:plain
これまでのレーティング推移.2019年末まではほとんどやっていなかったのが良く分かる.現在のratingは目標の青色から見ると3段階下である...

f:id:serihiro:20200519190029p:plain
横軸は日付,縦軸は解いた問題数の累積を示す.ここ一ヶ月ぐらいから急速に「精進」を始めたのがよくわかる.

また,競プロのスキルは昨今の転職活動において重要になりつつあると感じる.大学院時代,落ちたインターンは全部コーディングテストがあった.不慣れだった自分はビビって全然できずに落ち続けたのである.また,応募条件に「競プロなどで良い成績を収めた経験」を入れる企業も見かけるようになった.3年前はそんな企業は見たことがなかった.時代は間違いなく変わりつつある.募集しているpositionとアルゴリズムの実装能力に関係があるか否かはともかく,大学入試における大学入学共通テスト(a.k.a. センター試験)のような位置づけになりつつあるのではないかと考えている.

そんな訳で,最近はこっちのブログよりも別の競プロ精進ブログの更新頻度の方が高くなっている.

serihiro-competitive-programming.hatenablog.jp

どこまで目指すか?「赤」と言いたいところだが,他の人のブログなりを参考にすると初心者から1年間で到達できるのはだいたい青が限界のようだ.それも時間のある学生が,である.

なのでまずは2020年12月31日まで青到達を目指したい.なお今は茶色であり,道は長すぎるぐらい長い.でもやる.なにせ年齢を忘れたから.なんなら20歳ぐらいになった気持ちでやればいい.*2

機械学習が面白くなってきたのでE資格取るところまで行きたい

CourseraのMLコースを8週目までやってそこから時間的に厳しくなって*3一旦dropoutしてしまったのだが,機械学習は面白い.何より自分で実装するのが面白い.簡単な計算式の反復法で人間にとって有益な結果が得られるところも面白し,得られた結果からパラメータを試行錯誤する職人芸的なところも面白い.大学院時代に数値計算の講義で前処理付きCG法で一次方程式の解を求めるコードを書いたりしたがそれに近い面白さがある.

あと大学院では分散深層学習のtrainingを行う際の訓練データのread I/Oをいい感じに早くする方法について研究していたが,MLそのものはあまり深く勉強できていなかったので改めて勉強したいと思っていた.

で,やるならちゃんと客観的な結果が残るものをやろうということでディープラーニング検定E資格を取ることにした.

www.jdla.org

この資格は認定された講座を修了しないと受けられない仕組みになっており,自分は今月頭からスキルアップAIが提供する「現場で使えるディープラーニング」というコースをオンラインで受講している.*4

www.skillupai.com

オンラインなので,講義は全部動画配信で,課題提出はslack上で行われ,必要な情報はQiita::Team上で提供され,進捗報告はgoogle spreadsheet上で行われたりと,割と「今どきっぽい」ツールを使って運営されている.あと講師が現役のMLエンジニアなので結構突っ込んだ質問にも回答してもらるし,添削コメントがかなり細かったりとその品質は高いと感じている.今の所内容は既読の「ゼロから作るディープラーニング」の一巻目とかぶっているのだが復習だと思ってやっている.

↓2016年12月に謎にバズった「ゼロから作るディープラーニング」のレビュー

serihiro.hatenablog.com

当面はこれをやりつつ2021年2月のE資格試験に備える.あと一通り終わるのが8月ぐらいの見込みなのだが,終わったらkaggleもやっていきたい.あとCourseraのMLコースもせっかくなのでお金払って最初から全部やり直して認定証もらおうかなと考えている.Linked Inとかにロゴを掲載できるらしいし.

年齢を忘れる期間が2年間である理由

2年間は,自分が32歳〜33歳の間に大学院の修士課程に在籍した期間と同じであり,その経験から「30代前半において同じことに全力で取り組むことができる最長の期間は約2年間である」と予測した.よって2年間は集中して競プロと機械学習に打ち込める可能性が高い.逆にそれ以上だとマンネリ化するか燃え尽きてしまう気がしている.でもどちらも一旦止めるとすぐ忘れるのでずっと続けていきたい.

おわりに

人生の残り時間を数えるたびに不安に駆られる.でもまだギリギリ体も頭も十分に動くし,競プロをやっていて分かったのは,まだまだ自分は成長できるという事実である.本当になにか大きな変化を起こせるとしたら30代が最後だろうと思う.高校数学勉強しなおして数学検定2級取ったのも30超えてからである.*5

死ぬ直前に「30代の儂が競プロと機械学習をやっていれば...」と後悔しないようにやっていくぞい.

*1:競プロ用語.コンテストの過去問を説いたり新しいアルゴリズムについて勉強するなどの競プロのための鍛錬をすることを「精進」と呼ぶらしい.

*2:20歳の頃の自分は学部生で,バイトとサークルとCounter-Strike 1.6に明け暮れており,AM 3時に寝てAM 8時に起きて1限の講義に出る生活をしていた.体力ありすぎて笑う.

*3:競プロの精進に

*4:なおお値段は税込みで約30万円である.4ヶ月のプログラミングコースと考えれば相場より少し高いぐらいかなという気がしている.

*5:そのくせこないだのABC168のC問題は解けなかったので再び高校数学を勉強し直すべき時期時期かも知れない.

じぶん Release Notes (ver 0.33.9)

2020年1月は修論と引っ越しでバタバタしているうちに過ぎ去った.引っ越しは本当に体力使うのでしばらくやりたくない.大分モノは減らしたはずなのだが,それでも段ボール大小それぞれ7個を使うほどには荷物があった.

個人開発

  • なし.そろそろなんかやりたい.

研究

  • 修論発表を終えたのであとは電子版を提出するのみ.

読書

読んでる

読んだ

その他

  • 2年ぶりにちゃんとした健康診断受けたらAST,ALTの異常で精密検査を受けるよう言われた.
    • 都内で精密検査を受けたが肝臓は異常なし.中性脂肪とLDLコレステロールが高めなので運動療法で様子を見るように言われた.
    • 肝臓はエコー検査でhyperechoic areaが見つかり,おそらく良性の血管腫だろうとのことだが,念のため後日別の病院で造影CTを受けることになった
      • 造影CT検査の費用は12,000-15,000円とかなり高いのだが,一応
  • 東京に引っ越した
    • フレッツ回線がようやくまともな速度出るようになった.
      • 盛岡に住んでいた時もそうだったが,地方だとあからさまにネット環境が悪くなる.厳しい.
    • 6畳1Kなので以前よりもかなり狭いのだが,収納が充実しているので何気に広く部屋を使えている.収納の重要性を改めて感じた.
  • あと2月3日(月)から働く

2020年の目標 a.k.a. じぶん Release Notes (ver 0.33.8)

これは何か

  • 2020年の目標を定めておき,年末に振り返ってどの程度達成できたかを確認して自分を褒めたりけなしたりするための所信表明である

2020年1月1日時点の課題

  1. 英語力が必要になるのにTOEIC L&Rのスコアが700点しかなく,英語による意思疎通がほとんどできない.特にリスニングが壊滅的で,ネイティブの英語はゆっくり喋ってもらっても9割以上何を言ってるかわからない.
  2. 深層学習の理論についての知識が皆無に等しく,自分で問題を深層学習タスクに定式化して解くことができない.機械学習全般についても同様.
  3. 競技プログラミング力を通じてわかったことだがアルゴリズムの実装力がクソ雑魚すぎる
  4. ここ数年新しい技術を何も勉強していない

各課題を克服した状態の定義

1. 英語力

  1. TOEIC L&R 900点達成(点数に深い理由はないが今が700点なので1年で200点ぐらい伸ばしたいということで)
  2. 頻繁に使う表現は,聞いて理解でき発言することができ読むことができる

2. 機械学習

  1. kaggleのコンペで自分で特徴量を決定してモデルを実装して結果をsubmitできる
  2. Deep Learning検定 E資格を取得する
  3. 何らかのモデルの推論最適化を手でできる.理想を言えば最適化コンパイラを書いて自動最適化できる.

3. 競プロ力

  1. AtCoder青コーダー達成(今は茶コーダー)
  2. ABCなら4完は余裕.調子がいいときならABCDEF6完も.AGCもビビらずに出られる(今はWA連発してレーティング下がるのが怖くて出られない)

4. 新しい技術の勉強

  1. 何が当たるか分からないが量子コンピュータで何らかの数理最適化問題量子コンピュータで解ける形式に落とし込んで解けるようになる

課題を克服するための具体的な行動

1.英語

  • 諸事情により短期間で英語力を伸ばす必要があるため,短期集中で英語を学ぶレッスンに通って札束で殴る
  • 英語を話す機会を増やすためにDMM英会話などのオンライン英会話をやる
  • TOEIC L&Rの勉強をする.まずは語彙力が足りてないのでそれを伸ばしつつリスニングをがんばる(でもリスニングだけはどうやって勉強すればいいか分かってない)

2. 機械学習

  • DeepLearning検定は指定されたコースの受講が必要なのでそれを受ける
  • とにかくkaggleに出る
  • 自分はDLだとConv, FC,Pooling,Dropout,Sofmaxといったメジャーな計算しか知らないので,機械学習全般でどのような計算が行われるかを調べて,それぞれに対する最適化手法を研究する.コンパイラはそのあと着手する.

3. 競プロ力

  • 地道にAtCoderに出続ける
  • 過去問を埋め続ける
  • 自分が使えるアルゴリズムを地道に増やしていく

4. 新しい技術の勉強

  • 量子コンピュータについては本を一冊読んだ程度の知識しかないのでゼロから勉強し始める

会社員辞めて入学した大学院修士課程がそろそろ終わろうとしているのでまとめておく

これは何か

2018年3月に仕事を辞めて,2018年4月に筑波大学大学院システム情報工学研究科コンピュータサイエンス専攻博士前期課程(修士課程)に入学したのだが,もうすぐ修了なので大学院生活を忘れないうちにまとめておくだけのエントリである.修了自体は2020年3月だが,あとは修論を仕上げて提出すれば終了なので研究自体はもう実質終わっている状態である*1

筆者について

2009年3月に岩手大学農学部を卒業.新卒で上流系SIerに就職して2年半ぐらい勤務した後に,コード書きたくてwebアプリエンジニアに転向.その後,6年半ぐらいweb受託,webサービス運営企業などでソフトウェアエンジニアとして勤務.2018年3月に仕事を辞めて,2018年4月に大学院に入学した.詳しい入学の経緯は以下のエントリを参照.

serihiro.hatenablog.com

なぜ大学院に入ったのか

上のエントリと重複するが,簡単に言えばCS (Computer Science)を勉強したいと思ったからである.学部は農学部で,プログラミングは会社員になってからほぼ独学で勉強して,上流系SIerからweb屋にキャリアチェンジしている.そのため,きちんと体系立てられたCSの勉強をした機会が一切無かった.

CSが具体的に何を指すのかすら入学時点では良くわかってなかったが,それとは別に具体的な問題意識として,業務で解決できないパフォーマンス問題に遭遇するケースがたまにあって,そういうものをHWのスペックに頼らずにソフトウェアで解決するための基礎力を身に付けたいという動機があった.そのための道筋として,優秀なエンジニアが大体みんな口を揃えて「重要である」と語る「CS」をちゃんと勉強して,自分のスキルの幅を増やしたいというのが動機である.最終的には,プロジェクトやキャリアの選択の幅を広げることが目標だった.初めからMaster取ったら再就職する予定で,Ph.D.まで取ってアカデミアにキャリアチェンジしようとは思っていなかったし,実際,修了後は都内で再びソフトウェアエンジニアとして勤務し始める予定である.

CSの基礎知識はパタヘネに書いてあると思い込み,前職で輪読会をやったりして同僚と読んだりしたが,どうにもどの知識がどう役立つのかが分からない問題があった.「知識」ではなく「具体的に使える知恵」として昇華させるには,CSの研究を実践している場に行って学んで来るのが早かろうと思った次第である.詳しくは上のエントリに譲るが,ちょうど資金的にも親から少し借金すれば何とかなるぐらいの目処がついていた時期だった.

日本の大学院という場所について

日本の大学院を修了した方ならすでにお気づきだろうが,自分は入学時点で大きな思い違いをしていた.

それは「日本の大学院は勉強する場所ではない」ということである.何をする場所かといえば「研究をする場所」であり,「大学院生は研究室に所属して研究する人」という扱いである*2.つまり,何かを学ぶためにゼロからやってくる場所ではなく,必要な知識や技術は所有している前提で,その上で研究をする場所である.
なので,その事実が正しければ「CSを勉強したことないから日本の大学院行って勉強する」というのは誤った行動である.もちろん,大学院生はプロの研究者ではないので,その前提で扱われる.しかし,自身の研究によって対外的な成果が明確に求められる存在でもある*3.実際,自分の所属研究室でも多くの学生が国内外で対外発表をしている.

そういう環境なので,「自分は研究はそこそこやって,後はやりたい勉強を優先する」とはいかないのである.そういう「修論以外の研究はやりたい学生だけが頑張ればいい」という研究室もあるのかも知れないが,自分の場合はそうではなかった.仕事のように毎週ミーティングで進捗を共有する義務があるし,国内外の対外発表のタイミングが近づいてくれば「誰が論文を投稿できそうか」という話題がミーティング上の議題となる.入学前の自分は,研究で対外発表ができるほどの成果が出せるとは思っていなかったし,ちゃんと修了できればそれでいいぐらいにしか思っていなかった.また,指導教員とも入学前にこの辺の認識合わせをしていなかったため,入学後にこの実情を知り,若干面食らったというのが本音であったりする.

さて,そういう環境下において「CSを勉強する」ことを目的として入学したマヌケな自分はどう過ごしたかといえば,平日の日中は研究をして,夜や土日に図書館や自宅でやりたい勉強をしていた.時間の使い方だけ見れば会社員時代の仕事が研究にそのまま置き換わったような感じではあった.だが,研究と自分の勉強したい内容はある程度オーバーラップしていたので「プライベートの勉強に加えて研究からも勉強する」という体制が確立できていた.この辺は研究テーマの選び方次第という感じがするが,完全に違うジャンルだったらプライベートでの勉強が「完全なただの独学」となってしまい,効率がかなり下がっていて厳しかったと思う.オーバーラップしていたお陰で,勉強していて分からないこととか本の選び方等を研究室の学生や指導教官に質問できるのでこれはありがたかった.

プライベートで勉強したことを直接研究に反映できたかというと若干怪しいのだが*4,その逆として研究での実装作業を通じて学んだことは多かった.Pythonでの並行・並列プログラミングの難しさとか*5,用途に合わせた性能計測の仕方とか,再利用可能なshell scriptの書き方とか*6,Rのggplot2を使った見やすくてアカデミアでも怒られないマナー*7を守ったグラフの書き方とか.当初勉強したいと思っていたことをすべて消化できたかというとそんなことはないのだが,それでも自分が知らない知識や知見を得られるのはなんでであれ重要なので,いい経験になったと思う.英語の論文を読むことに一切抵抗がなくなったのも良かった.

CSについては色々と勉強した結果,「解決したい問題に対して最適な既知のアルゴリズムを選ぶ,もしくは自分で考案することが,コンピュータを効率よく使うための基本的かつ一番重要なアプローチ」ということが分かってきた,というか自分が一番苦手なのその部分だと分かってきたので,最近は競技プログラミングで修行している.*8

f:id:serihiro:20190523084807j:plain
研究室における筆者の作業スペース.ディスプレイがやたら余っていたので2台借りていた.PCはMacBook Pro (Retina, 13-inch, Mid 2015).

大学院での研究内容について

筑波大学大学院ではHigh Performance Computing System研究室に所属した.文字通りHigh Performance Computing,つまりスパコン*9に関する技術研究をする研究室である.

なぜこの研究室を選んだのかといえば,自分はもともとwebエンジニアで,現場で遭遇するパフォーマンス問題は大体が大規模なデータ処理に関するものだった.そのため,大規模データの処理に関する研究をする指導教官がいる研究室を選んだ,というのが動機となる.あとスパコンは当時の自分の知識体系からは最も遠い場所にある存在で,かつ民間企業,特にベンチャー企業では触れる機会がほとんどないもの,というイメージが強かった*10.なのでせっかくだし触れてみようと思った.

研究テーマとしては深層学習の訓練処理の高速化について取り扱った.深層学習を選んだのは「HPC + 深層学習(の中でも訓練処理)」の研究が2018年春の当時でトレンドになり始めており需要がありそうだったのと,自分自身がもともと統計や機械学習に興味があり多少独学で勉強していたので取っつきやすかったためである.

最初の研究は「深層学習の訓練処理中のGPUをプロファイルしてGPUの負荷がサチるギリギリのミニバッチサイズを見つける研究」というものである.これは事前調査でChainerのCIFAR100+VGG16のサンプルスクリプトを回してGPUの負荷状況をプロファイルしたところ,一般的なローカルミニバッチサイズである16や32で回すとGPU(P100とV100で実験)が相当遊んでいた事実に起因するネタだが,研究テーマがなかなか決まらなくて苦しみ続けてM1秋の修論中間発表*11の2週間ぐらい前にギリギリで思いついた思い出深い研究である.この研究自体は一度HPC研究会で発表はしてみたものの,実用性の問題とその後の研究の発展性が思いつかなかったことからそれっきりで終わってしまった.しかし,ImageNet 1-K (ILSVRC 2012のtrainデータ)を訓練データとして使用すると,CPU側での処理時間がボトルネックとなり,ミニバッチサイズを上げてもGPU側の負荷は断続的にしかかからず,結果的に訓練処理中のGPUのアイドル時間はCIFAR100を使った時と比べて相当長くなっている事実を発見した.これが次の研究につながった.詳細は以下を参照.

serihiro-graduate-school.hatenadiary.jp

先の研究が終わってから,指導教官は分散ファイルシステムやI/O最適化が専門なのでアドバイスを受けやすいその路線で何かいいネタはないかと先行研究をサーベイした.そして見つけたのが「訓練データのreadの高速化」というテーマだった.例えばEntropy-Aware I/O Pipelining for Large-Scale Deep Learning on HPC Systemsのように,大規模な訓練データを訓練プロセスに高速にfeedさせるための手法が提案されていた.訓練データのread自体はワークロードやHW環境に性能が強く依存するタスクなので,特定のケースに限定すればまだ何とか自分が手を付ける余地がありそうだ,と思った.

そんなこんなであれこれ考えて手法を思いついて実装して評価して論文にした結果,最終的にshort paperながらも国際会議に通せた.詳細は以下を参照.

serihiro-graduate-school.hatenadiary.jp

serihiro-graduate-school.hatenadiary.jp

自分の発表実績

査読付き国際会議のProceedingsが1本(short paper),査読なし国内研究会のProceedingsが2本というのが自分の最終的な実績である.多分もう増えないと思う*12

客観的に見て多いのか少ないのかは分からないが,B4の卒業研究からではなく,M1の4月からノープランな状態から研究ネタを考え始めた事実を考慮すればまぁまぁではなかろうか.理想を言えば,M1の6月ぐらいにテーマを決定して,12月のHPC研究会に一本出してM2の6月ぐらいには国際会議に投稿できるぐらいのペースで進めたかったが,実力不足で思うようにはいかなかった.

  • 査読付き国際会議

    • Kazuhiro Serizawa and Osamu Tatebe. 2019. Accelerating Machine Learning I/O by Overlapping Data Staging and Mini-batch Generations. In Proceedings of the 6th IEEE/ACM International Conference on Big Data Computing, Applications and Technologies (BDCAT '19). ACM, New York, NY, USA, 31-34. DOI: https://doi.org/10.1145/3365109.3368768
  • 査読なし国内研究会

大学院生活について

上述したように平日は研究室に行ったり講義を受けたりして,土日は主に自宅にいる生活をしていたので生活リズムは会社員時代と大して変わらなかった.寧ろ夜遅くまで仕事をしなければいけないという制約が無くなったので,以前よりも規則正しい生活となった.大体23時には寝て6時半ぐらいに起きる生活であり,7.5時間睡眠が維持されている.

一方で会社員時代から変わったこともある.それは経済活動で,要するに収入がガッツリ減ったので趣味とかに使えるお金がかなり制限された.まぁ初めからそれを分かっていたのだが,会社員時代には金額を気にせずに買っていた本が買えなくなったのは結構厳しさがあった*13.あと旅行に行けなくなったとか,東京の勉強会・技術カンファレンスに気軽に参加できなくなったりとか,趣味にお金をかけられなくなったのも痛かった.本はなるべく図書館で借りるとか東京行ったときにまとめて立ち読みすることで対応していたが,息抜きがうまく出来なくなってストレスが溜まっていた一時期は結構しんどい思いをしたりもした.そのためお金をかけない息抜きとして大学構内を毎日30分近く散歩することが新たな趣味となった.程よい運動になって良いのだが,生活水準が一気に下がると結構なストレスになる事実を身を以て学んだ次第である.

f:id:serihiro:20191121132812j:plain
筑波大学の北側はこんな感じの道が敷地の周囲に存在するため散歩するには丁度良かった

あとは,仕事をしなくなったので,誰かと一緒になにかをするという機会が殆どなくなったという変化がある.そのため,誰かと何かの問題を議論したり,相談を受けたり,逆に相談したり,というインタラクティブなコミュニケーションの量がかなり減った.指導教官と1 on 1をすることはあるが,仕事のそれと比べるとその機会は圧倒的に少ない.自分は一人で黙々と作業するのは得意というか好きな方だとばかり思っていたし実際そうだと思うのだが,それと同じぐらい他人とコミュニケーションをしたり何かを一緒にやることが好きだったようなので,その片方が無くなったので寂しいと感じた.大学院での教育として研究をしている側面もあるので,他の学生と協力してやる訳にもいかない部分があるため仕方ないのだが,この辺は長期的に開発のバイトとかをしていればもしかしたらカバーできたかもしれない.M1の夏に参加したトレジャーデータでの2ヶ月間のインターンが終わった直後に特にこの寂しさを感じたので,長年仕事してきて,仕事における他人とのコミュニケーションがいつの間にか日々の心の支えにもなっていたのかも知れない.

serihiro.hatenablog.com

おわりに

本エントリは,社会人学生 Advent Calendar 2019 というアドベントカレンダーを今日(2019/12/7)偶然見つけて,まだ埋まっていない日があったので,せっかくだから自分も書いて埋めようと思って書き始めたところ,書いてる間に枠が埋まってしまったのでアドベントカレンダー関係なくただ公開しただけのポエムである.

自分の場合,働きながらではなく仕事を辞めてガチ無職になり入学しているので,一般的な社会人学生としての苦労はほとんどなかったように思う*14.なので働きながら大学院に進学することを考えてる人が読んでもあまり参考にはならないと思われる.参考になるかもしれないのはフルタイム大学院進学を検討しているB3, B4あたりの学生かも知れない.

*1:終了に必要な単位はM1の時にすべて取ったが,趣味でM2の秋学期にも1個だけ講義を取っていたりする

*2:ここで「日本の」と書いたのは,海外の大学院だとCSコースでも研究室への所属や修論の執筆が義務化されていない場合があるためである

*3:これは自分の研究室におけるケースでありすべての研究室がそうであるとは限らない.

*4:プライベートではC++だとか数値計算の最適化だとか並列化とかコンパイラだとかアセンブリだとかニューラルネットの推論の最適化とかを勉強したり実装したりしていた

*5:multiprocessing.Queueはデフォルトだと中身が空にならないと親プロセスが終了しなくてジョブが終了しないままスパコンのポイントを浪費するとかそういう落とし穴をたくさん踏み抜いた

*6:スパコンの場合,ジョブスケジューラから指定できるのは1ファイルのshell scriptだけみたいな事が多いので,用途に応じて複数のshell scriptをloadしてタスクを構成して再利用できるようにしたりした

*7:軸の数値は必ず原点は0にするとか軸の対数・実数は揃えるとか凡例はグラフの中に書くとかのマナーが多い

*8:余談だが競プロ参戦記録などを記録するためのブログを最近始めた https://serihiro-competitive-programming.hatenablog.jp/

*9:「2位じゃダメなんでしょうか」でお馴染み

*10:今はAWS, GCPなどでもメニーコアCPUやGPU付きのインスタンスが利用できるようになったのでそのハードルはかなり下がったように思う

*11:筑波大のCS専攻生向けに書いとくと「CSセミナー」である

*12:BDCAT '19ではshort paperでacceptされたので,最初に投稿したfull paperの供養をどうするかと考えている程度である

*13:会社員時代は技術書やビジネス書や漫画の購入に毎月1万円程度使っていた

*14:住民税と任意継続した社会保険の初年度の支払いで苦しんだぐらいである

じぶん Release Notes (ver 0.33.7)

  • 11月は本当に生産性が低かった..ほとんど何をしていたか覚えていない.
  • 就活関係で色々対応しつつ,BDCAT 2019用のスライドと読み稿をガチガチに作り込んで一人で練習したりしていた.しかし,英語とはいえ高々15分程度のスライドに2週間近く準備期間を要していて,これは完全にやる気が出なかったようである.
  • 結局,精神的に厳しい状態にあると何も手につかないという当たり前のことを再確認するだけの一ヶ月だった.
  • 12月は色々ありそうなので挽回したい所存.

個人開発

ついに進捗がゼロになった.就活,国際会議の準備でもう何もやる気が出なかった.色々終わったら停滞していた分を取り戻すべく時間を費やしたい.

研究

  • BDCAT 2019のスライド作成と発表準備をしていた
  • 英語の発音に全く自信がないのと,最近何故か吃音がひどくなってきていることから余裕を持って喋れる文量まで削りまくった.

読書

その他

  • 就活での痛い失敗経験をもとに競プロに本格的に取り組もうと思い,競プロに関する記録を残すブログを開設した.

serihiro-competitive-programming.hatenablog.jp

  • 11月24日にはYahoo! JAPANのLODGEで掲載されたGiga Code2019 に参加し,LT聞いたりコンペに出たり競プロガチ勢と交流したりした.
    • 参加してみてわかったのだが,青色以上の人たちは解いている問題量が圧倒的に違う.とある方のLTによると,正確な数値は覚えてないのだが黄色以上のレート帯アカウントはABCだとD問題の回答率が相当高い傾向にあるらしい.つまりD問題埋めを地道に続けて結果につなげているということである.
    • 一つの基準として,黄色コーダー以上の多く(正確な割合は忘れたが)は合計で1,500問解いているらしい.当面は数をこなして1,500問以上解くことを一つの目標とするのが良さそうだ.
    • もちろん自分はまだたまにC問題が解けないことがあるので,C埋めも継続しなればならない.
    • 自分の解答状況はこんな感じである. f:id:serihiro:20191201173724p:plain