膨大な学習データファイルを転送

名大さんのスパコン'不老'に投げるために

2020年09月10日

1. tarによる圧縮転送

ファイルをローカルからリモートに転送するには, 一般的には, scpコマンドじゃないっすか! でも, 機械学習で使うような膨大なデータ(80GBとか余裕でいっちゃう系のやつ)は, scpだとバカみたいに遅い!! ということで, tar.gzで圧縮して転送する方法が大切っぽい.


              tar zcf - "directory" | ssh goto@nyoronyoro.ac.jp 'tar zxf -'
              
やってることは単純で, tarを利用して, 圧縮してローカルディスクに書き込む代わりに, sshを使用してネットワーク経由でリモートサーバに直接書き込んでいる.
cf) ssh経由のディレクトリ転送を効率的に行う

今更だけど, tarってなに? tarは複数のファイルを1つにまとめた'アーカイブファイル'を作成/展開するコマンドである. ちなみに, 「タルコマンド」と呼ぶらしい...

2. 圧縮しながら転送

さらに効率的な方法としては, "ディレクトリを圧縮しながら転送させる"という, なんともすごい方法がある.


              tar cvfz - "directory" | ssh goto@hogehoge.ac.jp 'cat > /path/to/save/.tar.gz'
              
とすると, ディレクトリをgzipで圧縮することになるし,

              tar cvfj - "directory" | ssh goto@hogehoge.ac.jp 'cat > /path/to/save/.tar.bz2'
              
にすると, bzip2で圧縮してくれるらしい. この研究室の環境だと, どれが最適なのか... めんどくさいから比較はしない!
実際に, scpじゃ半日かかっても終わらなかった転送が, 6時間ちょいで終わった! すげ〜〜!! ちょっと感動!!
cf) 仕事を早く片付けて遊ぶための技術メモ : 圧縮しながら転送するコマンド
cf) 俺備忘録 : ssh経由でのtarによるフォルダの圧縮・解凍方法

3. 圧縮・解凍しながらの転送

でも, 残念ながら, 上の方法だと, "圧縮しながら転送"はできるが, "解凍"はしてくれない... リモートに入って, 自分でtar.gz解凍コマンドを打ち直すしかない...
しかもこれだと, リモート先の容量を圧迫してしまう. だって, tar.gzファイルがある一方で, それを展開したファイルが増えるのだから!!
実際に, 75.8 GBのファイルをtar.gzに圧縮すると, 67 GBある. つまり, 合計で 140 GBくらいの容量になってしまって, 強制終了せざるをえなくなった...
ということで, "圧縮しながら転送し, 解凍しながら保存する"方法が, こちら!!


              tar cvf - ./data/ | gzip | ssh goto@hogehoge.ac.jp 'tar zxvf - -C /temp/'
              
すると, 転送先のディレクトリ構成としては, /temp/data/files となるらしい!! (未実装)
cf) ssh経由のディレクトリ転送を効率的に行う

4. 帯域容量の制限 - rsyncへ乗り換える -

で, 問題になってくるのは, 転送させるデータが大きすぎる場合, 通信容量を大幅にとってしまって, 研究室全体のパフォーアンスが落ちるとかなんとか... ということで, "通信に対して帯域制限をかける必要がある".
pvコマンドを使えば良さそう. 帯域制限は-Lオプションに, k,m,gとかを付けて指定できる. しかし, 研究室の環境に用意されていないので, アウト...
cf) sshで帯域制限pvコマンド

今までは, "tar圧縮先をsshによりリモートへ"を主として行ってきた. でもどうやら, rsyncのほうが, 手っ取り早くできるし, 研究室の環境下であっても, 簡単に速度制限をかけれる.


                # 転送速度を1MB/secに設定
                rsync --bwlimit=1024 -avz --chmod=u+rwx --delete -e "ssh -i /home/user1/.ssh/id_rsa" /home/user/www/copy_dir user2@example.com:/home/user2/copyed_dir
              
rsyncのオプションを説明していこ〜う!!
  1. --bwlimit : 転送量の制限(単位はB) 1MBだと1024になる.
  2. -avz : -aはdefalut(詳細はcfの2つ目を見てちょ! )で, -vでファイル名の表示, -zでデータを圧縮して転送
  3. --chmod=u+rwx : ファイルに関するすべての権限を転送先に持たせる.
  4. --delete : 同期. コピー元で削除されたファイルはコピー先でも削除される.
  5. -e ssh : SSH接続の設定
ということで, このrsyncを使う転送方法が正解だったそうですわ!! めでたしめでたし!!
ちなみに, 転送には, 30MB使っていいらしいですぞ!!
cf) 速度制限をかける方法のまとめ
cf) rsyncの使い方