きっちーの日記

へっぽこエンジニアの日々の記録

【IT エンジニア日記】CTC segmentationの存在を知った。

今日知ったこと

最近、機械学習のハイパーパラメータのために、学習スクリプトの引数を大量に作らなければ行けないことが多々ある。

例えば、pythonのargparseを使うと以下のように引数が膨大になる

python train.py --batch_size 10 --larning_rate 0.0000001 ......

そんなことをすれば毎回学習を回すたびにshell scriptを作って指定するなど、よくわからないことが発生する....

そこで、よく使われるのが OmegaConfやそれのラッパーとなるHydra Trainである

今回は、その2つの利点と欠点を今日自分で気づいたぶんだけ共有する

Hydra の便利なところ

Hydraは、yamlファイルをディレクトリ構造を持って作ることができる。

こんなふうに、ディレクトリ構造を持ってyamlを持てるので、default値とかが設定できる。

├── conf
│   ├── config.yaml
│   ├── db
│   │   ├── mysql.yaml
│   │   └── postgresql.yaml
│   └── __init__.py
└── my_app.py

Hydraの使いにくいところ

個人的に使いづらかったのは、コーディングしているときに、補完が効かなくなっているところである。そのため、大規模なモデルの開発や複数人でモデルを作るときは向いていないと感じた。

Omegaconfのいいところ

逆に、Hydraの問題点を解決できるのがomegaconfである(hydraでもできるのかもしれないですが、Hydraの設計思考的に、やる意味がないと思います。)

例えば以下のようなdataclassがあったとします

from omegaconf import OmegaConf
from dataclasses import dataclass

@dataclass
class SampleConfig:
    sample_no: int = 1000
    batch_size: int = 10

これを設定しておけば、structを作ってくれます

sample_conf = OmegaConf.strucured(SampleConfig)

後は、yamlから読み込んだり、yamlとして書き出したりすると、再度使えたりします。

最後に

Hydraは例えばfairseqに使われていたり、omegaconfはNeMoやCoquiなどに使われていたりします。両方使ってみた感じ、個人的にはomegaconfのほうが好きだし、コーディングもしやすいかなと思いました。

個人的に、これから趣味としてコーディングするときは、OmegaConfの方を使うと思います。

それでは

【IT エンジニア日記】Rustの並列化を頑張りたかった...

Rustのpythonバインディングで並列処理がしたい...

Pythonからrustのバインディングを行う際は、maturinを使って処理をする。 私の場合、pyo3の記法に則ってバインディング処理を書いているのだが、並列処理をする場合は、parallelここの記事を参考にすればいいと思った...思っていた...

できない...並列化できない

私のやりたいこととして、python側のnumpy行列を使って、並列処理を行いたかった。そのため、PyArrayを使って、引数で受け取っているのだが、どうしようにもうまく行かない。

やろうとすると、'staticに変換しないと行けないと言われるが、pyo3の仕様上そのようなことはできない...

今回は諦めて、代わりにpython側でjoblibによって並列処理することにした。

できなかった理由

あまり詳しくわかっていないのですが、私が思うに、pythonのnumpyオブジェクトをrustが使う場合、python で作った配列のポインタをrustが持つので、マルチスレッドで安全に処理できなかったのだと思う。

詳しい方いたら、コメントいただけると勉強になります。

まとめ

pythonのjoblibであると、スレッドセーフに処理ができていない気がするので、どこかで解決策や抜け道を見つけて処理させたい...

【IT エンジニア日記】 はてなブログをgit管理したら最高だった

初めに

学生エンジニアとして、若いうちから色々とアウトプットが大事だと思ったので、はてなブログで日記を書こうと思った。しかし、いちいちログインして記事を書くってめんどくさい...

Git 管理したい!!

zennみたいに、git管理できないか調査したところ、x-motemen/blogsyncでhatena-blogの同期をしてくれるツールを出してくれていたので、これを使って管理することにしました!

導入方法

基本的にはリポジトリのREADMEを読んで頂くと事足りるのですが、私の場合はmakefileにしてコマンド管理したかったので、本日も乙の記事を参考にさせていただきました!!

  • 注意点 私の場合はmacOS ユーザなので、brewなどを用いて環境構築しています。

1. Install command

Mac OSなのでhomebrewを使って環境構築しました。

brew install Songmu/tap/blogsync

2. hatena blog のconfigを容易

blogsync.default.yamlをblogsync.yamlに変更してAPI keyなどを書き足す

motemen.hatenablog.com:
  username: <USER NAME>
  password: <API KEY>
default:
  local_root: <LOCAL PATH>

3. Makefileを作る

私の場合は以下のようにMakefileでまとめています

DOMAIN = kichy-drums.hatenablog.com
DIALY_FILE_PATH = template/dialy_sample.yaml

pull:
    blogsync pull $(DOMAIN)

post_dialy:
    blogsync post --draft $(DOMAIN) < $(DIALY_FILE_PATH)

push:
    git diff origin/master --name-only   \
    | grep "$(DOMAIN)"                   \
    | xargs -t -n1 blogsync push

4. template作成

以下のdialy_sample.yamlを作成します。渡しの場合はtemplateディレクトリを作成してその中に作りました。

---
Title: タイトル 
Category:
- カテゴリ
---

テンプレート

5. 同期 & 記事作成 & 投稿

Makefileでコマンド操作できるようにしたので、以下のコマンドから記事を作成して投稿できます。

# 同期
make pull

# 記事作成
make post_daialy 

# 投稿
make push

感想

zennと同じように管理できるのはめちゃくちゃありがたい... GitHub Actionsで自動でpushできるようにしておきます。

ブログを初めてみた22歳

寒さも本番になって研究活動が忙しくなってきた今日このごろ

新しい自分と向き合えるチャンスだと思ってブログを書き始めました。

 

論文書くのが忙しい

まだ研究で作成したシステムの評価実験を終えていない僕でも、卒業論文を書き始めないと行けない焦燥にかられているわけですが、なかなか大変....

今日の研究室に来た目標はシステムと対話して、ログを残して、10パターンを終わらせること...

てことでがんばります

 

今やりたいこと

やりたいことが増えて来たので、ここいらでまとめておく

 

  • microCMSとNext.js を使ってブログを作成して、音楽関係のサイトを更新⇨収益化
  • 自宅にあるラズベリーパイをNASにして、どこからでもファイル参照できるようにする。
  • 筋トレを始める
  • Bit Coinの自動売買システムを作ってバーチャルで動かしてみて精度を見る

とりあえずこんなところかな

 

じゃあ研究をしてきます。