GNU Parallel という名の簡易ジョブスケジューラ
世間ではジョブスケジューラと聞くと具体的に何を思い浮かべる人が多いんでしょう。(HT)Condor や Torque のような共有計算機におけるジョブスケジューラや、Mesos、Omega や Borg のようなクラウド上の大規模クラスタスケジューラ?シンプルに OS のプロセス(タスク)スケジューラや、はたまた cron だったり、しますかね?いや、きっとジョブスケジューラなんて単語は聞いたことがない人がほとんどなんでしょう……。はい。今日は手元にある計算機の CPU リソースを存分に使いたおしつつ、たくさんのジョブをバッチ的にスケジューリングしたいときに役立つ GNU Parallel (以下 Parallel)の紹介をします。
Parallel は複数のジョブ(コマンドやスクリプト)を複数の CPU コアで並列に実行しくれるツールで、実は(あまり知られていない気がしますが)簡易ジョブスケジューラとして使うことができます。本家 man の EXAMPLE: GNU Parallel as queue system/batch manager
というところに簡単な例が書いてあって、いきなりですがこんなコマンドを実行します。
$ true > jobqueue; tail -n+0 -f jobqueue | parallel
jobqueue
というファイルが実行するコマンドのキューになります。Parallel はファイルを読み終わったら終了してしまうので、tail -f
をパイプに流し続けることで実行しっぱなしにします(-n+0
はなくても同じだと思うけど man に書いてあるとおりにしときます)。この状態で、jobqueue
ファイルに実行したいコマンドをどんどん追記していきます。
$ echo "my_great_program" >> ./jobqueue $ echo "my_great_program_with_args a b c" >> ./jobqueue $ echo "bash my_great_shell_script.sh" >> ./jobqueue :
そうすると jobqueue
に実行するジョブが書き込まれる度に Parallel が空いてる CPU コアで実行してくれます。空いているコアがない場合は実行を待ってくれるので、キューには好きなだけジョブを書き込んで大丈夫です。便利ですね。
手元では 4 コアのマシンを使っていてそのうち 2 コアだけを処理に使いたい、てなこともあるでしょう。その場合は Parallel に -j+N
オプションを渡すことで使う CPU コア数(N)が指定できます。
$ true > ./jobqueue; tail -n+0 -f ./jobqueue | parallel -j+2
デフォルトでは(たぶん)システムが搭載している数の CPU コア($ parallel --number-of-cores
)が全部使われる気がします。
これだけでも結構使いどころはある気がしますが、もう少し。ローカルのマシンに加えて ssh 接続できるマシンが何台かあって、それらも使いたいとします。ローカルのマシン名を local_machine、ssh 接続するリモートのマシン名を remote_machine_alpha、remote_machine_beta とします(注意点として、各マシンはパスワードなしで ssh 接続ができる必要があります)。この場合、下記のようなファイルを用意します。ファイル名は my_machines
としましょう。
2/local_machine 4/remote_machine_alpha 8/remote_machine_beta
2、4、8 というのはそれぞれのマシンで使用したい CPU コア数です。Parallel は下記のように --sshloginfile
オプションを用い上記ファイルを指定して起動します。
$ true > jobqueue; tail -n+0 -f jobqueue | parallel --sshloginfile my_machines
このようにすることで、合計 14(2+4+8)の CPU コアをフルに使ってジョブを並列に実行することができます。どのジョブをどのマシンで実行すれば良いかといった面倒くさい処理は全部 Parallel がよきに計らってくれるわけです。とっても便利ですね!
tail -f を grep できますか
できます。grep
に --line-buffered
を渡しましょう 。
$ tail -f file | grep --line-buffered pattern
重い腰を上げて Atom ことはじめ − LaTeX 環境設定編
もう随分長いこと、文章やコードを書くときは Vim というテキストエディタ(以下エディタ)のお世話になっています。良い感じに手に馴染んでおり大きな不満はないけれど、ときどきは世間の流行りが気になるものです。もっと良いものあるんじゃないかな?って。
巷では Sublime Text や Atom というエディタが注目されている模様。2017 年になったし心機一転、ブログでも始めるついでに新しいエディタをさわってみることにしました。まずは、日頃から少し不満を持っていた LaTeX 文書の作成を Atom でトライ!
目標としていたのは:
です。少し試してみて、まあまあいけるかな、っていう感じにはなりました。ちなみに計算機の環境は Mac で OS は El Capitan (10.11.6) です。
とりあえず Atom の設定
まずは Atom をインストールします。バージョンは 1.12.7
でした。少しだけ設定をいじります。
- 行間が開きすぎかなーと思ったので、
Settings => Editor => Line Height
を1.5
から1.3
に - なんとなくおしゃれになる気がしたので、
Settings => Editor => Show Indent Guide
を有効に Ctrl-Tab
とCtrl-Shift-Tab
の挙動が気にくわなかったので、keymap.cson
(Atom => Keymap...
) に下記を追加。何をしているかは ここ を参照
'body': 'ctrl-tab ^ctrl': 'unset!' 'ctrl-tab': 'pane:show-next-item' 'ctrl-shift-tab ^ctrl': 'unset!' 'ctrl-shift-tab': 'pane:show-previous-item'
本題ではないのでとりあえずこれくらいにしておきます。
LaTeX 用にカスタマイズ
LaTeX 環境はもともとインストール済み。MacTeX (なんか .pkg が 3GB くらいあるやつ)を毎年インストールしてます。気が向いたら $ sudo tlmgr update --self --all
としてパッケージの鮮度を保ってます。
さて。Atom には下記のパッケージをインストールしました。
latex
文書のコンパイル担当。競合パッケージとして latex-plus
と latextools
があるようです。latex-plus
が一番センスが良さそうな気がしたけど latex
を選択。理由は後述。
pdf-view
Atom 内の PDF 表示担当。Vim ではこれができないので憧れてました。SyncTeX もちゃんとサポートされています。PDF ビューワ内をクリックまたはダブルクリック(pdf-view
の SynTeX Reverse sync behavior
で設定)すると Tex ファイルの該当個所に (backword search)、Tex ファイル内で Ctrl-Opt-S
(Latex: Sync
) することで PDF の該当箇所に (forward search。こちらは latex
の機能) 飛びます。
autocomplete-bibtex
最初からインストールされている補完パッケージ autocomplete-plus
用の BibTeX autocomplete provider(と書けば良いのかな)。ちょっと設定にてこずりました。
config.cson
(Atom => Config...
) に下記を追加。
"autocomplete-bibtex": bibtex: [ "FULL_PATH_TO_YOUR_BIBTEX_FILE1" "FULL_PATH_TO_YOUR_BIBTEX_FILE2" : ] resultTemplate: "[key]" scope: ".text.tex.latex"
@example
という風に @
キーをトリガーに続けてタイプしていくと候補を絞ってくれます。 resultTemplate
の設定はお好みで。\\cite{[key]}
とかする手もあるけど \cite{}
内に複数の key を書くことはよくあるのでとりあえず [key]
にしました。
latexer
これまた補完担当。\ref{
とかタイプすると候補を出してくれたり(参照)、\begin{itemize}
とかして改行したら勝手に \end{itemize}
を挿入してくれたり(環境)、\cite{
とかタイプすると候補を出してくれたり(引用)します。引用の補完には上記の autocomplete-bibtex
を使うので、Settings
内の Autocomplete citations
は無効に。
linter-chktex
LaTeX 用の Linter。chktex
というのが LaTeX 文法の静的チェックをしてくれるツール(存在を今まで知らなかった)。
language-latex
リアルタイムプレビュー(自動保存と自動コンパイル)
さてあとはもう少し。文書を作成していて、自分でファイルを保存してコンパイルしないと更新された PDF を確認できないのって面倒くさいですよね。更新はリアルタイムに裏で勝手にやってほしい。つまり編集したそばからファイルが自動で保存されて、自動でコンパイルされる、という機能が必要です。ちなみに Vim のときは下記のように実現していました。
自動保存は
907th/vim-auto-save
プラグイン自動コンパイルは
latexmk
に-pvc
オプション を Vim から実行 。lervag/vimtex
プラグインがおすすめ
Atom でも同等のことを実現したいので少し調べてみました。自動保存に関しては最初から autosave
というパッケージがインストールされており、これを有効にしてみたものの思ったような動作ではなかったので同種のプラグインを色々(autosave-plus
、atom-idle-autosave
など)試してみたところ autosave-onchange
というパッケージが所望の動作をすることが分かりました。自動コンパイルに関しては latex
パッケージにだけ Build on Save
というドンピシャなオプションが用意されていました(これが latex
にした決め手)。
はい。autosave-onchange
パッケージをインストールして latex
パッケージの Build on Save
を有効に。これでリアルタイムプレビューができるようになりました。