ラベル Linux の投稿を表示しています。 すべての投稿を表示
ラベル Linux の投稿を表示しています。 すべての投稿を表示

2023年12月18日月曜日

古いmacのterminalにテコ入れをする

article_231115

古いmacを新しい気持ちで使うために

手元でもう10年越しになりつつあるMacBook Airがある。Intel Macだった時代のもので、もうハードとして色々なことが古くなってしまっているが、いまだに現役で使用している。発表や就職活動などで活躍してくれたが、もう少しで現役は引退かもしれない。後継の機種が決まるまではしばらく今まで通りに使っていきたいと思っている。

だが、10年も使用してくると見た目に飽きてくるということがある。少し前から、デスクトップの画像は写真や絵ではなく暗めの灰色単一色にしてしまっているが、逆に無機質な感じがして飽きが来るのを防いでくれていると思う。appleは随分古い機種もOSアップデートの対象にしてくれるので、OSの見た目は定期的に新味を感じられて良かった。

ターミナルの見た目を変えたい

端末の見た目も、定期的に変更していた。たまに環境設定からプロファイルを変更して見た目を変えたりもしていたが、さすがに見飽きてきて、大幅に変更したいと前々から思うようになっていた。加えて、syntax highlightなどの強化もしたいと思い、方法を調査した。下の情報がわかりやすく、参考にさせていただいた。

gnu系のコマンドを使用できる環境にしたい

もう一つ思っていたのは、macで使用できるコマンドが普段多用しているgnu/linux系のものではないため、微妙にoptionなどが異なっていて不便だったので、それをなんとかしたいということだった。端末上で何かやりたい時のコマンドをgnu/linuxにした環境を作って、作業の時はそこに入れば良いのではと考えた。検索して情報を探していくと、homebrewでコマンド群をインストールしていく解説が複数あり、下記の情報がわかりやすかった。

テキスト処理のための標準的なコマンド群の macOS への導入手順

homebrewも使用しているが、今回はcondaによってgnu系環境を別途用意するという方法をとった。どちらかというとhomebrewで整備していく方法のほうが理にかなっているのかもしれないが、今回は元のmac (UNIX)の環境とも簡単に行ったり来たりできるようなものにしたいと思い、conda環境を使用した。デフォルトの環境は手をつけず、gnu系コマンド群を使用したいときにcondaの環境に入って使用するというイメージだ。homebrewでもそのような簡単な切り替えができるのかもしれないが、調べてはいない。

軽量なエディタのnanoのsyntax highlightに関する情報は、以下のサイトを参考にさせていただいた。

nanoもcondaにより導入したので、上の記述から若干変更して、.nanorcを作成した。

手順

1. conda environment

まずは、condaでgnu用の環境を作成した。ipythonなども導入して、データ解析、プロセシング等を実施する際に入るような環境を想定した。

conda create -n gnu
conda activate gnu

2. coreutils + other tools + python

conda環境に入ったあと、gnu/linux風にしたいコマンド群+pythonをインストールしていった。インストールするツール群については、前述の標準コマンド群を解説した記事を参考にさせてもらった。

# Coreutils
conda install -c conda-forge coreutils
# Other commands
conda install -c conda-forge diffutils
conda install -c conda-forge gzip
conda install -c conda-forge grep
conda install -c conda-forge gawk
conda install -c conda-forge nano
conda install -c conda-forge unzip
conda install -c conda-forge wget pandoc
# Python 3.12.0 install
conda install -c conda-forge python
conda install -c conda-forge ipython
conda install -c conda-forge pandas numpy

3. Solarized

先にあげた導入情報のリンクを参考にして、solarizedをインストールした。まずは、solarized.gitをgit cloneした。

git clone https://github.com/tomislav/osx-terminal.app-colors-solarized solarized.git
>> Cloning into 'solarized.git'...
>> remote: Enumerating objects: 80, done.
>> remote: Total 80 (delta 0), reused 0 (delta 0), pack-reused 80
>> Unpacking objects: 100% (80/80), done.

その後、ターミナルの環境設定からプロファイルを選択した。ダウンロードしたsolarized.gitフォルダ下にあるSolarized Dark.terminalを環境設定のプロファイルの読み込みから指定して読み込み、デフォルトに設定した。

4. .bash_profile編集

gnu/linuxのコマンド群を通常利用することを考え、環境をactivateして、またlsで色分けして表示できるようにするために、.bash_profileの内容を編集した。

# 以下の記述を加える
conda activate gnu
alias ls='ls --color=auto --group-directories-first'
eval `dircolors ~/.dircolors-solarized/dircolors.256dark`

5. nanoのsyntax highlight

基本的には、Syntax highlighting in nano on Mac OSに説明されている.nanorcの作成をするのだが、condaで導入しているため、記述が若干だが異なる。

cat ~/.nanorc
>> include "/path/to/home/miniconda3/envs/gnu/share/nano/*.nanorc"

minicondaのenvs/環境名/share/nano下には、.nanorcのファイルが格納されているので、それを読み込んでいることになる。

# miniconda3/envs/gnu/share/nano 下のファイル
extra             css.nanorc      html.nanorc        markdown.nanorc  perl.nanorc    sql.nanorc
asm.nanorc        default.nanorc  java.nanorc        nanohelp.nanorc  php.nanorc     tcl.nanorc
autoconf.nanorc   elisp.nanorc    javascript.nanorc  nanorc.nanorc    po.nanorc      tex.nanorc
awk.nanorc        email.nanorc    json.nanorc        nftables.nanorc  python.nanorc  texinfo.nanorc
c.nanorc          go.nanorc       lua.nanorc         objc.nanorc      ruby.nanorc    xml.nanorc
changelog.nanorc  groff.nanorc    makefile.nanorc    ocaml.nanorc     rust.nanorc    yaml.nanorc
cmake.nanorc      guile.nanorc    man.nanorc         patch.nanorc     sh.nanorc

これで、nanoを開いたときにもハイライト表示がされるようになった。

2023年5月10日水曜日

home directoryのdisk quotaでしばしば躓く

解析サーバーでのトラブル

たまに聞く話として、サーバにVS codeを使ってremote SSHでアクセスしている場合に、アップデートをしたタイミングからssh接続できなくなることがある。最初はアップデートされたextentionの問題なのではないかと考え、前バージョンへのダウン等でトラブルシューティングを試みたのだがうまくいかない。remote SSHしようとする時に、ホストにサーバーがインストールできないというエラーメッセージが表示されており、途中からホストのホームディレクトリに書き込みできない状態になっているのではないかと考えたて確かめていくと解決することがある。


原因はdisk quotaのオーバーにより書き込みできなくなったこと

ホームディレクトリに移ってduで使用状況を調べてみた。


$ du -sh ~


すると、決められたdisk quotaを2GBほど超過した状態であることがわかった。どこに大きなファイルがあるのかを調べてみた。


$ du -sh ~/*


隠しファイルについても以下のように調べた。


$ du -sh ~/.[^.]*


大きなものとしては、使用しているcondaのディレクトリや、.cache/firefoxなどが肥大化しているようだった。.cache/firefoxはfirefoxのキャッシュファイルだが、こんなに大きくなっているとは思わなかった。これらのファイルを削除したり、別に移したりすることで、disk quota内に収めたのち、改めて手元のPCからVS codeでssh接続してみると、今度は無事に接続することができた。


過去にも類似のトラブルを複数回経験

思い返すと、過去にもdisk quota超過での書き込み不可によるトラブルを経験しているのが思い出された。conda updateでアップデートしたり新しいアプリケーションをインストールしたりしようとしたときにできない、ということがあり、ホーム下のminiconda3のディレクトリに書き込めなくなっていることが原因だった。VS Codeもsshアクセス先のホーム下に.vscode-serverというフォルダを作っていたが、disk quota超過によりここに書き込めなくなっていることが今回の原因だったらしい。この.vscode-serverディレクトリも1.4Gほどあり、かなり大きかった。


miniconda3のディレクトリが肥大化しがち

ホームディレクトリを大きくする原因の一つは、.cache下のファイルもあるが、miniconda3が大きくなることが一番の原因のように思われた。いくつもアプリケーションを導入したり、環境をたくさん作ったりすると、すぐに5G、10Gに肥大化してしまう。


一つの解決策としては、conda cleanを使用して不要になったファイルを削除することだと思う。ただ、--allを使うと不具合が生じると述べているサイトもあり(問題なかったとする人もいる)、今回は--tarballsでtarballのみ削除することにした。

あるいは、ホーム下のcondaの設定ファイルの.condarcの中に、pkgs_dirsの記述で別のパスを記載することで、そちらにpkgsの大きいファイルを格納するようにしたら、ホーム下のサイズは小さくすることができると思う。


pkgs_dirs:

 - /path/to/conda-pkgs/pkgs


また、envのフォルダを別の場所にとりあえず移動し、リンクを張ることでホーム下miniconda3のサイズを削除できるようだった、この方法でリンクを張った後でもその環境を使うことができた。このようにした方がいいのか、あるいは、ホーム下.conda/environments.txtに各environmentのパスが書かれていたので、こちらを編集した方が良いのかもしれない。


envのディレクトリの位置は、プロジェクトのフォルダ下に作って共有するといったやり方もあるらしく、これは解析の時にも便利なように思った。disk quotaを気にせずにそれぞれの解析ごとに環境を準備することもできるので、次回以降試してみたいと思った。


disk quotaのチェック

今回のこともあり、ホームディレクトリのディスク使用量をたまに確認することにした。隠しファイルについても表示するための"disk_quota_check"というエイリアスを新しく.bash_aliasesに記述した。


alias disk_quota_check='echo "---total---"  &&  du -sh ~  &&  echo "--- dir --"  &&  du -sh ~/*  &&  echo "---invisible---"  &&  du -sh ~/.[^.]*'


また、.bashrcに以下の記述をした。


if [ -f ~/.bash_aliases ]; then

    ~/.bash_aliases

fi



参考

2021年5月7日金曜日

References of Ubuntu 20.04 Installation

Description 

Ubuntuマシンを使いたくなり、久しぶりにLinuxのクリーンインストールを実施した。手法の詳細は様々な情報があるので、差し当たり自分が使用した情報のreferenceを覚書として記録した。


References

ubuntu.jp

  1. https://www.ubuntulinux.jp

ブートUSB作成(Mac)

  1. https://sy-base.com/myrobotics/mac/ubuntu_bootusb/

ubuntu 日本語Remixダウンロードサイト

  1. https://www.ubuntulinux.jp/download

インストール情報

  1. https://linuxfan.info/ubuntu-20-04-install-guide#google_vignette

日本語入力変換

  1. https://linuxfan.info/ubuntu-18-04-japanese-input

解像度問題〜NVIDIA gpu  driver更新

  1. https://ayatansnl.hatenablog.com/entry/2016/03/02/190055
  2. https://zenn.dev/190ikp/articles/how_to_install_nvidia_drivers
  3. https://qiita.com/kenji-miyake/items/06b8c3807bef0ba5c451#nvidia-driver-のインストール
  4. https://hibiki-press.tech/dev-env/ubuntu/add-ppa/4640
  5. https://qiita.com/ksasaki/items/b20a785e1a0f610efa08
  6. https://k-hyoda.hatenablog.com/entry/2020/07/09/223907
  7. https://linuxconfig.org/how-to-install-the-nvidia-drivers-on-ubuntu-20-04-focal-fossa-linux

IPアドレス確認

  1. https://news.mynavi.jp/article/20190825-883094/

SSHインストールと接続

  1. https://codechacha.com/ja/ubuntu-install-openssh/
HDD, SSDマウント確認
  1. アプリケーション:「ディスク」で確認できる。マウントポイントも見れる。ここでマウントポイントの書き換えも可能らしい
  2. コマンドラインで見るときはfdiskで確認できる
  3. sudo disk -l
  4. ファイルシステムの確認は、lsblk -f
  5. マウントポイントは/media/<my_dir>/<UUID>になっていた。UUIDが長いので、この「ディスク」アプリケーションを使って書き換えることもできそう。

解析用プログラム、アプリケーション準備
  1. Atom
  2. Anaconda3 (Jupyter, Spyder)
  3. R
  4. RStudio
  5. R package各種






2020年1月28日火曜日

テキストエディタの正規表現だけでうまいこと処理する

学生がデータのファイルを扱う上で、結果の一部を抽出したり、複数のフォルダからファイルを指定したりとか、コピペやGUI操作だと面倒だなと感じる作業がある。スクリプトを書けば一発なのだろうが、あまり詳しくない学生の場合、とてつもなく敷居が高く感じられる。また、教える方もその場でスクリプトを書いて渡すといった時間が取れないことの方が多いし、なんでもやってあげるのはむしろ為にならない気がする。こういった時に、効率は悪いかもしれないが、GUIで使っているテキストエディタの検索・置換機能に正規表現が使える場合、これを使うのが一番手っ取り早い気がしている。

研究室のPCでは、BBEdit (https://www.barebones.com/products/bbedit/) かAtom (https://atom.io/) を主に使っている。これらは両方とも正規表現を使った検索や置換が行える。例えば、Blastのアラインメントの結果ファイルを持っている場合に、そのアラインメントされた配列だけ欲しいといった場合がある。普通にスクリプトを一つ作っておけばいいのだろうが、それができない場合、下手をすると配列をコピー&ペーストして目的のファイルを作ろうとする学生が出てくる。ファイルが小さければまだいいが、たくさんhitがある結果ファイルだったりすると、コピペだけで何日も過ぎてしまうといった悲喜劇になりかねない。こういった時に、あまり詳しくない学生であっても使える手段として、テキストエディタの置換機能があると思う。

実際どうするかは頓知のようなところがあるし、よりうまいやり方を思いつく人もいると思う。例えば下のような結果ファイルについて

Score:80234 bits(88982), Expect:0.0, 
Identities:49320/52479(94%),  Gaps:1419/52479(2%), Strand: Plus/Plus

Query  126153  TTACGACTATGAAAATGAATGAATAAAAAACGTTTATTCGAAATTATAA-----GTATCT  126207
               |||| ||||||||||| |||||| |||||  |||||||| |||||||||     ||||||
Sbjct  50916   TTACAACTATGAAAATTAATGAAGAAAAAG-GTTTATTCTAAATTATAAATTAAGTATCT  50974

Query  126208  ATCTCGATATATCGATAGATAGTGATTGGATCCACTGAAATCAAATGAAATCAAATTTGG  126267
               ||||||||||||||||||||||||||||| |||| |||||| |||||||||         
Sbjct  50975   ATCTCGATATATCGATAGATAGTGATTGGCTCCATTGAAATAAAATGAAAT---------  51025

Query  126268  TTTTCCGTTTTATTCTGAACGACCCCCAGGACTTATGGTTTAGGGTCTGGGAGttttttt  126327
                ||||||||||||||||||||| ||||||||||||||||||| | | ||| | |||||||
Sbjct  51026   -TTTCCGTTTTATTCTGAACGATCCCCAGGACTTATGGTTTATGATATGGAAATTTTTTT  51084

Query  126328  tATGAACCAACAAATTGAAAGTAACCAGTTAGAAATAAAGAATACAATAATAAGTCAAAA  126387
               |||||||| |  |||| ||||||||| |||||||||||||||||||| || |||| ||||
Sbjct  51085   TATGAACCGAGCAATTAAAAGTAACCTGTTAGAAATAAAGAATACAAAAAAAAGTAAAAA  51144


コピペでqueryとsbjctの配列をつなぎ合わせて行っているような場合がある。なんの罰ゲームかという感じだが、まずは下の正規表現で配列だけの状態にする。

検索:
Query[ ]+\d+[ ]+([ATGCNatgcn-]+)[ ]+\d+\n[ ]+[\| ]+\nSbjct[ ]+\d+[ ]+([ATGCNatgcn-]+)[ ]+\d+\n\n

置換:
\1\n\2\n\n

そうした上で、次は、下記の検索・置換を何度か繰り返して、その度に配列をつなげていく。

検索:
([atgcATGCnN-]+)\n([atgcATGCnN-]+)\n\n([atgcATGCnN-]+)\n([atgcATGCnN-]+)\n\n

置換:
\1\3\n\2\4\n\n

見てもらってわかるように、query-sbjctの組み合わせ2つごとに配列をつなげていく処理を繰り返しているだけだ。かなり原始的だが、スクリプトを一つも書かずにとりあえずの目的は達成することができる。

別の例では、複数のフォルダにファイルを4つずつ分けて入れていて、フォルダが合わせて数十あるといった時に、それぞれのファイルをCUIのプログラムで処理したいときに、シェルでの操作とテキストエディタだけで、とりあえずシェルスクリプトを準備してしまう、といったことが考えられる。再帰的にディレクトリの中を表示する為に、まずコマンドラインで、ls の -Rオプションが使える。ファイルに"_R1_"か"_R2_"という文字が入っている場合 (XXXYYZZ_001_R1_0001.fastq.gzなど。で、ファイルのR1とR2が対になっている) は、

ls -1R | grep "_R1_" > list.txt

とすればファイルのリストができる。それをテキストエディタで開いて、例えば

検索:
(.+)_R1_(.+)

置換:
Command -1 \1_R1\2 -2 \1_R2_\2 --output outtext.txt

などとすれば、XXXYYZZ_001_R1_0001.fastq.gzXXXYYZZ_001_R2_0001.fastq.gzの二つのファイルを入力としてoutputをだすCommandのシェルスクリプトができる。

くどいようだが一番いい解決方法ではないかもしれないが、あまり背景知識がない学部生にも簡単に教えられて、処理のかなりのスピードアップが見込めるやり方だと思う。

シェルスクリプトやpythonなどを抵抗感なく使いこなしている学生はほとんどいないと思う。そのベースラインから初めてスクリプトを書くことを覚えていくのは結構厳しい(やったら力つくと思うのだけど)。そういった時に、上のようなテキストエディタ&正規表現での処理が入って行きやすいように思えた。こういうので興味を覚えた人は、実際にスクリプトを書いて正規表現処理することを自分で覚えていくのだろうと思うし、そうして欲しいと思った。





2019年12月18日水曜日

ディレクトリの移動とパス

3年生に最初の解析を教えている際に、ディレクトリの移動やパス指定でつまづいていることがわかった。コマンドライン操作が得意な人は色々と使いこなしていると思うのだが、とりあえず以下の点を知っていれば困らないだろうということをまとめる。

pwd   :   自分がいるディレクトリを表示する

cd /path/to/dir   :   /path/to/dirに移動する

cd   :   ホームディレクトリに移動する

cd ..   :  一つ上のディレクトリに移動する
 
cd ../..   :   2つ上のディレクトリに移動する

cd ~   :   ホームディレクトリに移動する

cd ~/Desktop   :   ホームディレクトリ下のDesktopに移動する

cd -   :   直前にいたディレクトリに移動する

.   :   カレントディレクトリ
..   :   一つ上のディレクトリ。ディレクトリは階層構造になっていて、パスの上の方は一意に決まる
~   :   ホームディレクトリ

macだと、テキストエディタのようなアプリケーションの上だとか下にパスを示してくれていることが多い。例えば、atomのウィンドウの上っ側にはホームディレクトリからのパスが表示されている。

また、左側のProjectに表示されているファイル名を副ボタンクリックして、ファイルのパスをコピーすることができる。

 そのほかのテキストエディタでもパスが表示されている。


macのFinderでも、パスを簡単にコピーすることができる。 finderメニューバーの「表示」から、「パスバーを表示」を選択すると、下側にパスが表示される。
アイコンを副ボタンクリックすると、'190926_1_par2.shのパス名をコピー'といったオプションが選択でき、簡単にfinder側に表示されたファイルのパスをコピーできる。


2019年11月27日水曜日

研究室の計算機をリモートで使うときのコマンドまとめ

研究室で想定させる解析環境として、各自がPCを持っていて、それに加えて解析用のちょっと性能のいいLinux機(xeonやi7、RAM100~200Gbほど)などが1〜2台あり、リモートログインで使っているというような状況が考えられる。こういったときに比較的軽い解析やプログラミングは手元のPCで行い、重めの解析はLinux機でやるといった運用が一般的かなと思う。そういったときにリモートログインを含め、色々と便利なコマンド操作をまとめておく。研究室に分属した学生がとりあえず解析マシンにアクセスできるようになる、ということを目標にして、知っておいたほうが良いことだと思う。

(1)マシンスペック、環境

現在の環境を簡単にまとめる。
手元のパソコン:MacBook Pro 15inch corei7 16GbRAM 1TbSSD
Linux機:CentOS6.7(final) Xeon  CPU E5-2630 v3 2.4GHz 256GbRAM 500GbSSD+1.8TbSSD+6TbHHD+5TbHDD

主に手元のMacで日々の作業を行い、解析はLinux機に投げている。学科が所有している解析サーバーがあり、そちらは1TbRAMを積んでいてアッセンブルなども滞りなくできる。

(2)ログイン、ログアウト

ssh接続でログインする場合、以下のように接続する。
> ssh username@133.101.... 

ポート指定が必要な場合は、-pで指定する。
> ssh username@133.101....  -p xxxx

これでログインすると、向こうのホームディレクトリにいく。
ログアウトする場合は、exitコマンドを叩く。
> exit

ssh:
https://www.atmarkit.co.jp/ait/articles/1701/26/news015.html
exit:
https://tech.nikkeibp.co.jp/it/article/COLUMN/20060227/230763/

 

(3)シャットダウン

ssh接続しているコマンドラインからシャットダウンする場合、sudoで行う。
> sudo shutdown -h now

これで接続が切断して、こちら側に帰ってくる。
https://www.atmarkit.co.jp/ait/articles/1701/19/news012.html

 

(4)データのコピー

scpコマンドを使って、リモートで接続しているパソコンにデータをコピーすることができる。
> scp mydata.txt username@133.101....:/path/to/copy/
https://www.atmarkit.co.jp/ait/articles/1701/27/news009.html

linux側からmacにコピーする場合、macの側のシステム環境設定で、共有のリモートログインがオンになっている必要がある。設定は、システム環境設定>共有>リモートログイン:オン

(5)外部ストレージのマウント

外付けhddやssdを接続した場合、マウントポイントにマウントしてあげる必要がある。
初めての場合、mkdirでマウントポイントになるディレクトリを 作成する。現在自分は解析用ディレクトリの中にマウントポイントを作っている。一度作れば、次回以降そこにマウントする。再度mkdirは必要ない。

> mkdir /path/to/mountpoint/dir1 

先ほど作ったdir1にマウントする場合、あらかじめデバイスの名前を検索しておく必要がある。上記環境の場合、/devの下にある名前を探して、sdd1だった場合、
> sudo mount /dev/sdd1 /path/to/mountpoint/dir1
https://www.atmarkit.co.jp/ait/articles/1802/15/news035.html

使い終わって外付けのsddなどを取り除く場合、
> sudo umount /path/to/mountpoint/dir1
https://www.atmarkit.co.jp/ait/articles/1802/16/news025.html

(6)マシンスペックの確認


GUIで使っていればアプリケーションからマシンスペックは簡単に確認できるが、コマンドラインで確認しようと思った場合、以下のようなものが使える。

# CPU
> cat /proc/cpuinfo
# コア数だけ表示
> nproc --all

# RAM
> cat /proc/meminfo
 または、dmidecodeを使って、
> sudo dmidecode -t memory
https://www.atmarkit.co.jp/ait/articles/1904/04/news018.html

# ストレージ
## マウントポイント、容量
> df -h
https://www.atmarkit.co.jp/ait/articles/1610/24/news017.html
ディスクの空き領域を示すことができる。 --totalで、全体の合計も表示してくれる。
## hddの詳しい内容
> sudo parted -l
https://www.atmarkit.co.jp/ait/articles/1803/08/news017.html 
-l(--list)オプションで、全てのブロックデバイスの情報を示すことができる。
## パーティション情報
> lsblk
https://www.atmarkit.co.jp/ait/articles/1802/02/news021.html
## osのバージョン(centosの場合)
> cat /etc/redhat-release

(7) Nvidia GPU使用状況

nvidiaのGPUを使っている場合、搭載されているGPUの情報や使用状況は、以下のコマンドで確かめられる。
> nvidia-smi
https://developer.nvidia.com/nvidia-system-management-interface

(8)ラン状況の確認

投入したランの状況の確認
> jobs
https://tech.nikkeibp.co.jp/it/article/COLUMN/20060227/230804/

プロセスの確認
> ps a
https://www.atmarkit.co.jp/ait/articles/1603/28/news022.html

> top
https://www.atmarkit.co.jp/ait/articles/1706/30/news018.html

(9)ジョブの投入、キル

手元のターミナルからsshでジョブを投入する場合、途中で手元のPCからログアウトする可能性もある。このとき単純にコマンドを実行している場合、手元のターミナルを閉じた段階で実行中のランも終了してしまう。そうならないために、nohupコマンドを使う。

> nohup ./runscript.sh > nohup.1.out &

ラン実行中の標準出力はnohup.1.outの方に保存されている。&をつけることで、バックグラウンドジョブとして動く。これで、手元でターミナルを閉じてもrunscript,shは実行されたままになる。
https://www.atmarkit.co.jp/ait/articles/1708/24/news022.html

 たまに、実行したけど後から設定の間違いに気づき、実行途中のジョブを取りやめたい場合などがある。その場合は、まず実行されているプロセスIDを調べる。
> ps a
このとき、終了させたいプロセスのPIDを確認する。PIDが6631だった場合、
> kill 6631
とすれば、6631のプロセスを終了させることができる。
https://www.atmarkit.co.jp/ait/articles/1604/05/news022.html
他人が解析しているランを間違って終了させてしまった場合とても悲惨なことになるので、注意する。

2019年11月25日月曜日

解析用Linux機のRAM, ROM 増設

普段使用しているLinux機に少しだけRAMとROMを増設した。ROMはかねてからSSD上でランを行いたいと考えていたこともあり、SSD2Tbを増設、解析中のデータを置くための場所にした。解析終了した結果などは、前に増設した6TbのHDDの方に移すことにしようと思う。RAMの方は、16Gbを16枚刺して256Gbとした。時たまだけれどメモリ不足が理由でランが不正終了してしまうことがあったので、その対策として増設した。多分、手元に置いておくコンピュータとしては十分な性能になったと思うし、大抵のことはここでできるのではないかと思う。

(1) 増設作業


今回増設ぶんのWD BLUE SATA SSD 2Tb 。


電源変換ケーブルは、前回HDD増設時に購入したものと同じものを用意した。



増設するSSDは2.5インチサイズなので、HDDの増設場所に設置できるように、マウンタも用意した。中には固定用のネジも付属していた。


マウンタにネジで止めて、HDD用の3.5インチベイに固定した。


 下が、3.5インチベイに載せたところ。裏側にネジ止めできるところがなく、ピンを合わせているだけになっている。

 これを増設用の最後のスペースにセットした。SATAケーブルと電源ケーブルを差し込み、こちらの設置は完了した。



 メモリも少しだが増設した。今回増設に使ったのは、下の16Gbのメモリ。


 取り付けのために外したCPUファンなどを取り付けていき、タイラップでケーブルを整理して、増設は終了した。


(2) SSDパーティション、ext4フォーマット、マウント

 gdiskを使って、パーティションを切る作業を行う。 デバイスがsddとして認識されていることを確認後、sudoでgdiskを使う。

> sudo gdisk /dev/sdd

 GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.

Command (? for help): p
Disk /dev/sdd: 3907029168 sectors, 1.8 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): 17DED95E-5EFC-47ED-A30A-BE7B0C4FA7B3
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 3907029134
Partitions will be aligned on 2048-sector boundaries
Total free space is 3907029101 sectors (1.8 TiB)

Number  Start (sector)    End (sector)  Size       Code  Name

Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-3907029134, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-3907029134, default = 3907029134) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

Command (? for help): p
Disk /dev/sdd: 3907029168 sectors, 1.8 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): 17DED95E-5EFC-47ED-A30A-BE7B0C4FA7B3
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 3907029134
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048      3907029134   1.8 TiB     8300  Linux filesystem

Command (? for help):  w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdd.
The operation has completed successfully.



パーティションが作成できたら、ext4のファイルシステムでフォーマットする。

> sudo mkfs.ext4 /dev/sdd1

[sudo] password for t:
mke2fs 1.41.12 (17-May-2010)
Discarding device blocks: done                           
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
122101760 inodes, 488378385 blocks
24418919 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
14905 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

Writing inode tables: done                           
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 29 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.


その後、マウントが自動的に行われるように、/etc/fstabファイルを編集する。はじめに、増設したssdのUUIDを調べる。uuidがわかったら、以前に増設されている時のフォーマットを真似て、UUIDを書き足す。

> ls -l /dev/disk/by-uuid/

マウントするディレクトリを作る。
> sudo mkdir /home2

uuidがわかったら、エディタで/etc/fstabを開き、末尾に以下を追加。

UUID=9ac........(調べたUUID) /home2(マウント場所)                  ext4(フォーマット)    defaults        1 2

 ここまで終わったら再起動する。再起動後はマウントされた状態になっている。

(3) メモリ増設確認


増設されたメモリがきちんと認識されているか以下のコマンドで確認する。

> sudo dmidecode --type memory


(4) テストラン


以前、メモリ不足が原因と考えられるエラーで最後までランできなかったpilonのコマンドを打って、今回正常にランできるかを確認してみる。

> ls -lh

合計 23G
-rw-rw-r--. 1 t t  23G 11月 25 16:30 2019 aln_jump_pe.sorted.bam
-rw-rw-r--. 1 t t 680K 11月 25 16:28 2019 aln_jump_pe.sorted.bam.bai
-rw-rw-r--. 1 t t 188M 11月 25 16:28 2019 m16032.contigs.fasta

-rw-rw-r--. 1 t t 7.1M 11月 25 16:28 2019 pilon-1.23.jar
drwxrwxr-x. 2 t t 4.0K 11月 25 16:28 2019 results_dir
-rwxr-xr-x. 1 t t 3.0K 11月 25 17:09 2019 run190330_2_pilon_test1_rerun191125.sh


# 実行スクリプト
java -Xmx192G -jar ./pilon-1.23.jar --genome m16032.contigs.fasta \

        --bam ./aln_jump_pe.sorted.bam \
        --output test_pilon --outdir results_dir --changes --vcf --tracks \
        --verbose


 timeにより時間を計りながらランを行なった。ランは増設したSSD上にデータを置いて行ったが、非常に静かで驚いている。メモリ使用量を確認してみたところ、ランからしばらく経った時点で100Gbを超えていた。その後も順調に増大していっている感じだ。

> top

top - 18:29:54 up  3:31,  2 users,  load average: 1.36, 1.30, 1.21
Tasks: 736 total,   2 running, 734 sleeping,   0 stopped,   0 zombie
Cpu(s):  3.2%us,  0.3%sy,  0.0%ni, 96.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  264420640k total, 122277664k used, 142142976k free,   217416k buffers
Swap: 16449532k total,        0k used, 16449532k free, 48035036k cached


以前はこの段階でランが強制的に終了してしまっていたが、今回は問題なく進行しているよう。

(2019.11.26 AM 追記)
次の日きたら解析は無事に終了していた。さすがにこれだけ増設したらメモリ不足による終了はしなくなったみたいだ。

2019年11月5日火曜日

GPU計算によるbasecallの速さに驚愕する

MinIONはライブラリ準備やランは非常に簡単に行えるようになっていて、ランしたらすぐにデータがたまっていく。しかし、そのデータをベースコールするところで非常に時間がかかることがわかって困っていた。ライブベースコールを選択すると、ランと同時にベースコールをおこなうが、CUPベースだと一回のデータを処理し終わるのに2〜3週間かかるペースであることが分かってきた。コア数の少ないcpuよりもgpuベースの処理をおこなうほうが格段に早いらしい。これまでバイオインフォマティクス系のプログラムはcpuのコア数(スレッド数)とRAMの多さが重要なものが多かったので(あとは、シングルコアだけ使う場合はcpuの処理速度か)、gpuについてはほとんど考えたことがなかった。数年前に購入したlinux機もRAMこそ98gb、cpuはxeonにしたが、gpuは一番安いオプションで済ませた(そのせいかやたらカクつく)。Nanoporeからはgpu向けのローカルベースコール用のプログラムが公開されているが、linux向けだけだ。

周りに適当な機材がないか考えているときにふと思い出して、近くのX線の構造解析を行なっているラボに聞いてみると、GeForce 2080Tiを二台(!!)積んでいるlinux最近買ったよ、とのこと。早速伺ってお借りすることにした。nanoporeのcommunityサイトからプログラムのチュートリアルとダウンロードサイトに行ってチュートリアルに従って導入していく。

https://community.nanoporetech.com/protocols/Guppy-protocol/v/gpb_2003_v1_revn_14dec2018

sudo yum install epel-release
sudo yum install ./ont-guppy-3.3.0-1.el7.x86_64.rpm


 rpmをダウンロードしてyum installで入れていくのだが、ここで最初は以下のようなエラーメッセージがあった。

Error: Package: ont-guppy-3.3.0-1.el7.x86_64 (/ont-guppy-3.3.0-1.el7.x86_64)
           Requires: libcuda.so.1()(64bit)
 You could try using --skip-broken to work around the problem
** Found 1 pre-existing rpmdb problem(s), 'yum check' output follows:
system-config-samba-1.2.100-2.1.noarch has missing requires of system-config-samba-docs



どうも、gpuを使うライブラリが無いことによる問題に思われたので、ググってみると以下のサイトからダウンロードできるようだったので、rpmをダウンロードしてyum installした。

https://pkgs.org/download/libcuda.so.1()(64bit)

https://centos.pkgs.org/7/rpmfusion-nonfree-updates-x86_64/xorg-x11-drv-nvidia-390xx-cuda-libs-390.129-1.el7.x86_64.rpm.html

sudo yum install ./xorg-x11-drv-nvidia-390xx-cuda-libs-390.129-1.el7.x86_64.rpm

このあともう一度guppyをインストールすると (sudo yum install ./ont-guppy-3.3.0-1.el7.x86_64.rpm) 今度はうまく行った。試しにコマンドを打つとヘルプページが出力された。


: Guppy Basecalling Software, (C) Oxford Nanopore Technologies, Limited. Version 3.3.0+c1fce59

Usage:

With config file:
  guppy_basecaller -i <input path> -s <save path> -c <config file> [options]
With flowcell and kit name:
  guppy_basecaller -i <input path> -s <save path> --flowcell <flowcell name>
    --kit <kit name>
List supported flowcells and kits:
  guppy_basecaller --print_workflows
Use GPU for basecalling:
  guppy_basecaller -i <input path> -s <save path> -c <config file>
    --device <cuda device name> [options]
Use server for basecalling:
  guppy_basecaller -i <input path> -s <save path> -c <config file>
    --port <server address> [options]

Command line parameters:
  --print_workflows                 Output available workflows.
  --flowcell arg                    Flowcell to find a configuration for
  --kit arg                         Kit to find a configuration for
  -m [ --model_file ] arg           Path to JSON model file.
  --chunk_size arg                  Stride intervals per chunk.
  --chunks_per_runner arg           Maximum chunks per runner.
  --chunks_per_caller arg           Soft limit on number of chunks in each
                                    caller's queue. New reads will not be
                                    queued while this is exceeded.
  --overlap arg                     Overlap between chunks (in stride
                                    intervals).
  --gpu_runners_per_device arg      Number of runners per GPU device.
  --cpu_threads_per_caller arg      Number of CPU worker threads per
                                    basecaller.
  --num_callers arg                 Number of parallel basecallers to create.
  --post_out                        Return full posterior matrix in output
                                    fast5 file and/or called read message from
                                    server.
  --stay_penalty arg                Scaling factor to apply to stay probability
                                    calculation during transducer decode.
  --qscore_offset arg               Qscore calibration offset.
  --qscore_scale arg                Qscore calibration scale factor.
  --temp_weight arg                 Temperature adjustment for weight matrix in
                                    softmax layer of RNN.
  --temp_bias arg                   Temperature adjustment for bias vector in
                                    softmax layer of RNN.
  --hp_correct arg                  Whether to use homopolymer correction
                                    during decoding.
  --builtin_scripts arg             Whether to use GPU kernels that were
                                    included at compile-time.
  -x [ --device ] arg               Specify basecalling device: 'auto', or
                                    'cuda:<device_id>'.
  -k [ --kernel_path ] arg          Path to GPU kernel files location (only
                                    needed if builtin_scripts is false).
  -z [ --quiet ]                    Quiet mode. Nothing will be output to
                                    STDOUT if this option is set.
  --trace_categories_logs arg       Enable trace logs - list of strings with
                                    the desired names.
  --verbose_logs                    Enable verbose logs.
  --qscore_filtering                Enable filtering of reads into PASS/FAIL
                                    folders based on min qscore.
  --min_qscore arg                  Minimum acceptable qscore for a read to be
                                    filtered into the PASS folder
  --disable_pings                   Disable the transmission of telemetry
                                    pings.
  --ping_url arg                    URL to send pings to
  --ping_segment_duration arg       Duration in minutes of each ping segment.
  --calib_detect                    Enable calibration strand detection and
                                    filtering.
  --calib_reference arg             Reference FASTA file containing calibration
                                    strand.
  --calib_min_sequence_length arg   Minimum sequence length for reads to be
                                    considered candidate calibration strands.
  --calib_max_sequence_length arg   Maximum sequence length for reads to be
                                    considered candidate calibration strands.
  --calib_min_coverage arg          Minimum reference coverage to pass
                                    calibration strand detection.
  --trim_threshold arg              Threshold above which data will be trimmed
                                    (in standard deviations of current level
                                    distribution).
  --trim_min_events arg             Adapter trimmer minimum stride intervals
                                    after stall that must be seen.
  --max_search_len arg              Maximum number of samples to search through
                                    for the stall
  --reverse_sequence arg            Reverse the called sequence (for RNA
                                    sequencing).
  --u_substitution arg              Substitute 'U' for 'T' in the called
                                    sequence (for RNA sequencing).
  --override_scaling                Manually provide scaling parameters rather
                                    than estimating them from each read.
  --scaling_med arg                 Median current value to use for manual
                                    scaling.
  --scaling_mad arg                 Median absolute deviation to use for manual
                                    scaling.
  --trim_strategy arg               Trimming strategy to apply: 'dna' or 'rna'
                                    (or 'none' to disable trimming)
  --dmean_win_size arg              Window size for coarse stall event
                                    detection
  --dmean_threshold arg             Threhold for coarse stall event detection
  --jump_threshold arg              Threshold level for rna stall detection
  --pt_scaling                      Enable polyT/adapter max detection for read
                                    scaling.
  --pt_median_offset arg            Set polyT median offset for setting read
                                    scaling median (default 2.5)
  --adapter_pt_range_scale arg      Set polyT/adapter range scale for setting
                                    read scaling median absolute deviation
                                    (default 5.2)
  --pt_required_adapter_drop arg    Set minimum required current drop from
                                    adapter max to polyT detection. (default
                                    30.0)
  --pt_minimum_read_start_index arg Set minimum index for read start sample
                                    required to attempt polyT scaling. (default
                                    30)
  --log_speed_frequency arg         How often to print out basecalling speed.
  --num_barcode_threads arg         Number of worker threads to use for
                                    barcoding.
  --barcode_kits arg                Space separated list of barcoding kit(s) or
                                    expansion kit(s) to detect against. Must be
                                    in double quotes.
  --trim_barcodes                   Trim the barcodes from the output sequences
                                    in the FastQ files.
  --num_extra_bases_trim arg        How vigorous to be in trimming the barcode.
                                    Default is 0 i.e. the length of the
                                    detected barcode. A positive integer means
                                    extra bases will be trimmed, a negative
                                    number is how many fewer bases (less
                                    vigorous) will be trimmed.
  --arrangements_files arg          Files containing arrangements.
  --score_matrix_filename arg       File containing mismatch score matrix.
  --start_gap1 arg                  Gap penalty for aligning before the
                                    reference.
  --end_gap1 arg                    Gap penalty for aligning after the
                                    reference.
  --open_gap1 arg                   Penalty for opening a new gap in the
                                    reference.
  --extend_gap1 arg                 Penalty for extending a gap in the
                                    reference.
  --start_gap2 arg                  Gap penalty for aligning before the query.
  --end_gap2 arg                    Gap penalty for aligning after the query.
  --open_gap2 arg                   Penalty for opening a new gap in the query.
  --extend_gap2 arg                 Penalty for extending a gap in the query.
  --min_score arg                   Minimum score to consider a valid
                                    alignment.
  --min_score_rear_override arg     Minimum score to consider a valid alignment
                                    for the rear barcode only (and min_score
                                    will then be used for the front only when
                                    this is set).
  --front_window_size arg           Window size for the beginning barcode.
  --rear_window_size arg            Window size for the ending barcode.
  --require_barcodes_both_ends      Reads will only be classified if there is a
                                    barcode above the min_score at both ends of
                                    the read.
  --detect_mid_strand_barcodes      Search for barcodes through the entire
                                    length of the read.
  --min_score_mid_barcodes arg      Minimum score for a barcode to be detected
                                    in the middle of a read.
  --num_barcoding_buffers arg       Number of GPU memory buffers to allocate to
                                    perform barcoding into. Controls level of
                                    parallelism on GPU for barcoding.
  -q [ --records_per_fastq ] arg    Maximum number of records per fastq file, 0
                                    means use a single file (per worker, per
                                    run id).
  --read_batch_size arg             Maximum batch size, in reads, for grouping
                                    input files.
  --compress_fastq                  Compress fastq output files with gzip.
  -i [ --input_path ] arg           Path to input fast5 files.
  -s [ --save_path ] arg            Path to save fastq files.
  -l [ --read_id_list ] arg         File containing list of read ids to filter
                                    to
  -p [ --port ] arg                 Hostname and port for connecting to
                                    basecall service (ie 'myserver:5555'), or
                                    port only (ie '5555'), in which case
                                    localhost is assumed.
  -r [ --recursive ]                Search for input files recursively.
  --fast5_out                       Choice of whether to do fast5 output.
  --resume                          Resume a previous basecall run using the
                                    same output folder.
  --max_block_size arg              Maximum size (in events) of outgoing
                                    basecall messages (server mode only).
  --disable_events                  Disable the transmission of event tables
                                    when receiving reads back from the basecall
                                    server.
  --progress_stats_frequency arg    Frequency in seconds in which to report
                                    progress statistics, if supplied will
                                    replace the default progress display.
  -h [ --help ]                     produce help message
  -v [ --version ]                  print version number
  -c [ --config ] arg               Config file to use
  -d [ --data_path ] arg            Path to use for loading any data files the
                                    application requires.



試しに、fast5ファイル100つを以下のコマンドでベースコールしてみた。

time guppy_basecaller --input_path ./recovered_all --save_path ./basecalled --flowcell FLO-MIN106 --kit SQK-LSK109

communityサイトの情報では数時間程度で終了するものと思ったが、次の日にきてみてもほとんど終わっていない。おかしいなと思って改めて調べてみると、gpuをいくつどれくらい使うかを指定するオプションがあるようだ。どうもこれで明示的に示していないとgpuを使う方にはならないらしい。


改めて以下のコマンドで実行してみる。

time guppy_basecaller --device auto --input_path ./recovered_all --save_path ./basecalled_2 --flowcell FLO-MIN106 --kit SQK-LSK109

すると、前回は静かなままだったマシンが実行と同時にファンが全力で回転しだした。ディレクトリの方にもすぐにファイルが溜まりだす。nvidia-smiのコマンドでgpuの使用率をみてみると、一つ目のgpuがほぼ100%で稼働していることがわかる。やった!と思いしばらく放置して置くと、おおよそ2hr程度で全ての処理が終わっていた。

ONT Guppy basecalling software version 3.3.0+c1fce59
config file:        /opt/ont/guppy/data/dna_r9.4.1_450bps_hac.cfg
model file:         /opt/ont/guppy/data/template_r9.4.1_450bps_hac.jsn
input path:         ./recovered_all
save path:          ./basecalled_2
chunk size:         1000
chunks per runner:  512
records per file:   4000
num basecallers:    4
gpu device:         auto
kernel path:       
runners per device: 4

Found 103 fast5 files to process.
Init time: 3645 ms

0%   10   20   30   40   50   60   70   80   90   100%
|----|----|----|----|----|----|----|----|----|----|
***************************************************
Caller time: 7760063 ms, Samples called: 76667689592, samples/s: 9.87978e+06
Finishing up any open output files.
Basecalling completed successfully.

real    129m44.435s
user    187m49.615s
sys    62m54.971s


せっかくだから、オプションで2つのgpuを稼働させてみたらどれくらい時間短縮されるか検証してみた。最初は以下のオプションでランを始めたのだが、nvidia-smiで確認しても、gpu一つしか使っていない様子だった。
time guppy_basecaller --device cuda:0 cuda:1 --input_path ./recovered_all --save_path ./basecalled_2 --flowcell FLO-MIN106 --kit SQK-LSK109  



おかしいなと思い、一度killしてチュートリアルにある別の表記方法でオプション指定してもう一度ランしてみると、今度は2つ同時に使っているようだった。
time guppy_basecaller --device cuda:all:100% --input_path ./recovered_all --save_path ./basecalled_2 --flowcell FLO-MIN106 --kit SQK-LSK109

nvidia-smi


2つ使った場合は終了までに80minほどかかっているようだった。きっちり時間半分とはならなかった。

ONT Guppy basecalling software version 3.3.0+c1fce59
config file:        /opt/ont/guppy/data/dna_r9.4.1_450bps_hac.cfg
model file:         /opt/ont/guppy/data/template_r9.4.1_450bps_hac.jsn
input path:         ./recovered_all
save path:          ./basecalled_2
chunk size:         1000
chunks per runner:  512
records per file:   4000
num basecallers:    4
gpu device:         cuda:all:100%
kernel path:       
runners per device: 4

Found 103 fast5 files to process.
Init time: 1601 ms

0%   10   20   30   40   50   60   70   80   90   100%
|----|----|----|----|----|----|----|----|----|----|
***************************************************
Caller time: 4833539 ms, Samples called: 76667689592, samples/s: 1.58616e+07
Finishing up any open output files.
Basecalling completed successfully.

real    80m56.413s
user    171m45.150s
sys    65m24.722s


Nanoporeのプログラムや実験プロトコルは頻繁に改訂が行われているようだが、オプション指定の所の説明も、やや表記に間違いが含まれているようだった。何か問題があると思うときは色々試してみたほうがよさそうだ。

とにかくgpuによる処理の速さにびっくりした。これは、ベースコールはgpuを積んだlinuxにやらせるの一択だと思った。今から思うともっと下調べしておけばよかったという感じだが、macでRAMを余計に積んでいてもランやベースコールのところにはそんなに使われていない。それよりもコア数の多いgpuをたくさん持っていることの方が重要だったみたいだ。こうなるとgpu欲しくなるなと思った。GeForce RTX 2080Tiとか、Quadro RTX 6000とか(高すぎか)。機械学習の勉強もかねて、とか言い訳も色々浮かんでくるようになってきた。