序章









格安でGPUサーバーが借りられるとして最近話題の「vast.ai」で,時間単位で最強のGPUクラスタを借りていろいろと遊んでみました。

参考までに,例えば現在 RTX 3090 (30.0 TFLOPS) が \\$0.089/h,H100 SXM (53.5 TFLOPS) が \\$1.874/h,RTX 5090を4台搭載したGPUクラスタ (430.3 TFLOPS) が \\$1.881/h で貸し出されています。

さくらインターネットの高火力 DOKサービスがH100を1時間1,008円で貸し出しているので,単純計算でその1/4近い価格設定ですね。

これは,vast[.]aiが個人・小規模事業者・マイニング事業者が所有するGPUマシンをP2P的にGPUを貸し出すサービスであり,運営コストが極端に低いためです。

その代わりに,ほとんど動作保証がなかったり,安定性がサーバーによってまちまちだったりするというデメリットがあります(ホストが落ちればセッションも終了)。

セットアップ方法から諸々の利用方法まで,備忘録として残しておきます。vast.aiでGPUを借りてみたいとお考えの方は,ぜひ参考にしてください。




アカウント作成









まずは以下のURLにアクセスして,サクッとアカウントを作成します。

Vast.ai | Console - cloud.vast.ai

Githubと連携して登録する方法が一番楽なのでお勧めです。



*Continue with GithubでGithubのアカウントを利用して登録/ログインができます。



アカウントを作成したら,次にコンソールの「Billing」からデポジットを追加します。いくつか選択肢がありますが,まずは練習用に$5(750円)を追加するのがお勧めです。






「stripe」を選択すると,クレジットカードで支払いができます。私はデビットカードで支払いました(高校生はクレジットカードが持てない;)

また,crypto.comなどを利用した仮想通貨による支払いにも対応しているようです。

入金に成功すると,右上に現在のクレジット残高が表示されます。






これで,ひとまずGPUサーバーを借りる準備は完了です。




インスタンス探し









コンソールのSearchを開くと,現在利用できるインスタンスの一覧が表示されます。ここで,スペックと金額を見て,利用目的に合わせてインスタンスを決めます。






大量に表示されるので悩みますが,基本的には「TFLOPS」と「\\$〇〇/hr」の項目を見れば大丈夫です。

「H100」はFP64性能が高くメモリが大きいのでディープラーニング向き‥など細かい制約はあるものの,原則はTFLOPSが大きい=高性能と考えて問題ありません。

金額の見方についてですが,金額の表示にカーソルを重ねると詳細が見れます。






「GPU On-Demand」がGPUインスタンス自体の価格であり,「Disk」が保存領域に対してかかる金額,「Internet」がそれぞれ外/内向きのトラフィックにかかる金額です。

ここで,「Disk」の費用はサーバーを起動していない状態のときにも継続してかかることに注意してください(不要なインスタンスはきちんと削除する必要があります)。




立ち上げ方法









興味のあるサーバーを見つけたら,「RENT」を押して利用を開始します。

いくつかイメージが選択できますが,ひとまず練習用には「NVIDIA CUDA」がお勧めです。もちろん用途に応じて自由に選択していただいて構いません。

すると自動的に「Instances」にインスタンスが表示されるので,「Creating」が「Open」になるまで少し待機します。



「Open」が表示されたら,早速それを押してください。

すると,新しいタブで次のような画面が表示されるはずです。






ここで「Jupyter」を押すと,サーバーのファイルマネージャーが開きます。






また,ここで「Jupyter Terminal」を押すと,サーバーのターミナルが開きます。



※オレオレ証明書によるエラー画面が表示されても,無視して続行してください。

背景が黒ではないターミナルはターミナルとは呼べないので,ターミナルの設定からテーマを変更してみましょう。






個人的には黒背景の高コントラスト設定が好みです。



これで自由にインスタンスを触れるようになりました。




ひとまずやり方は分かったので,インスタンスを終了・削除してみます。

といってもやり方はとても簡単で,「Instances」の画面からゴミ箱のボタンを押すとインスタンスが即時削除されます。



ただし,この場合はデータが完全に削除されることに注意してください。

もしデータを残した場合には,その一つ左のボタンを押すことでインスタンスの「停止」ができます(ただしその場合,ディスク料金の課金が続きます)。




最強のGPUクラスタを借りてみる









早速ですが,このサービスを利用して最強のGPUクラスタを短時間だけ借りてみます。

普段なら高校生の私には絶対に手の届かないスーパーコンピューターに匹敵する性能の環境も,時間単位の課金なら気楽に遊べちゃいます(!)

いろいろと高性能なインスタンスを探していたところ,これが目に留まりました。






12x RTX 5090 (1328.6 TFLOPS) の環境が $6.573/hr だと!?とても安い;

単純比較はできませんが,つい最近の2019年まで利用されていた日本のスーパーコンピューター「京」の実効性能は10,510 TFLOPS程度であるため,この環境を8個用意すれば国家級スーパーコンピューターの性能に匹敵することになります。恐ろしい....。

早速借りてみました。やってみたいことは以下の3つです。

(i) スペック情報表示ツール「fastfetch」実行

(ii) ハッシュ攻撃ツール「hashcat」のベンチマーク実行

(iii) 「VanitySearch」によるBitcoinアドレスの探索




fastfetch実行









fastfetchは有名なスペック表示ツール「neofetch」の後継です。

CUDAイメージの環境だと直接aptでは入れられないので,add-apt-repositoryを経由して導入します。

```Bash
apt-get update
apt-get install -y --no-install-recommends software-properties-common ca-certificates gnupg
add-apt-repository -y ppa:zhangsongcui3371/fastfetch
apt-get update
apt-get install -y fastfetch
```


インストールができたら,以下のコマンドで実行します。

```bash
fastfetch
```


実際の実行結果はこんな感じです。






CPU「AMD EPYC 7H12 64-Core Processor」と12枚のGPU,さらに512GBのメモリがきちんと認識されていることが確認できます。




hashcatのベンチマーク









言わずと知れたハッシュ攻撃ツール「hashcat」のベンチマークを実行します。

```Bash
apt-get install -y hashcat
hashcat -b
```





実際の実行結果は以下の通りです。

```Bash
hashcat (v6.2.6) starting in benchmark mode

CUDA API (CUDA 12.9)
====================
* Device #1: NVIDIA GeForce RTX 5090, 31598/32109 MB, 170MCU
* Device #2: NVIDIA GeForce RTX 5090, 31598/32109 MB, 170MCU
* Device #3: NVIDIA GeForce RTX 5090, 31598/32109 MB, 170MCU
* Device #4: NVIDIA GeForce RTX 5090, 31598/32109 MB, 170MCU
* Device #5: NVIDIA GeForce RTX 5090, 31598/32109 MB, 170MCU
* Device #6: NVIDIA GeForce RTX 5090, 31598/32109 MB, 170MCU
* Device #7: NVIDIA GeForce RTX 5090, 31598/32109 MB, 170MCU
* Device #8: NVIDIA GeForce RTX 5090, 31598/32109 MB, 170MCU
* Device #9: NVIDIA GeForce RTX 5090, 31595/32106 MB, 170MCU
* Device #10: NVIDIA GeForce RTX 5090, 31598/32109 MB, 170MCU
* Device #11: NVIDIA GeForce RTX 5090, 31598/32109 MB, 170MCU
* Device #12: NVIDIA GeForce RTX 5090, 31598/32109 MB, 170MCU

OpenCL API (OpenCL 3.0 PoCL 5.0+debian Linux, None+Asserts, RELOC, SPIR, LLVM 16.0.6, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
==================================================================================================================================================
* Device #13: cpu-haswell-AMD EPYC 7H12 64-Core Processor, 256751/513567 MB (65536 MB allocatable), 128MCU

Benchmark relevant options:
===========================
* --optimized-kernel-enable

-------------------
* Hash-Mode 0 (MD5)
-------------------

Speed.#1.........: 218.4 GH/s (12.95ms) @ Accel:16 Loops:1024 Thr:1024 Vec:1
Speed.#2.........: 216.2 GH/s (13.06ms) @ Accel:16 Loops:1024 Thr:1024 Vec:1
Speed.#3.........: 218.9 GH/s (12.91ms) @ Accel:16 Loops:1024 Thr:1024 Vec:1
Speed.#4.........: 216.1 GH/s (13.09ms) @ Accel:16 Loops:1024 Thr:1024 Vec:1
Speed.#5.........: 211.8 GH/s (13.33ms) @ Accel:16 Loops:1024 Thr:1024 Vec:1
Speed.#6.........: 218.0 GH/s (12.96ms) @ Accel:16 Loops:1024 Thr:1024 Vec:1
Speed.#7.........: 212.8 GH/s (13.26ms) @ Accel:16 Loops:1024 Thr:1024 Vec:1
Speed.#8.........: 213.5 GH/s (13.23ms) @ Accel:16 Loops:1024 Thr:1024 Vec:1
Speed.#9.........: 215.2 GH/s (13.11ms) @ Accel:16 Loops:1024 Thr:1024 Vec:1
Speed.#10.........: 215.6 GH/s (13.09ms) @ Accel:16 Loops:1024 Thr:1024 Vec:1
Speed.#11.........: 219.0 GH/s (12.89ms) @ Accel:16 Loops:1024 Thr:1024 Vec:1
Speed.#12.........: 214.0 GH/s (13.20ms) @ Accel:16 Loops:1024 Thr:1024 Vec:1
Speed.#13.........: 5065.2 MH/s (2.57ms) @ Accel:1024 Loops:128 Thr:1 Vec:8
Speed.#*.........: 2594.5 GH/s

----------------------
* Hash-Mode 100 (SHA1)
----------------------

Speed.#1.........: 71331.7 MH/s (19.87ms) @ Accel:32 Loops:1024 Thr:256 Vec:1
Speed.#2.........: 70782.2 MH/s (19.99ms) @ Accel:32 Loops:1024 Thr:256 Vec:1
Speed.#3.........: 71433.3 MH/s (19.85ms) @ Accel:32 Loops:1024 Thr:256 Vec:1
Speed.#4.........: 70633.5 MH/s (20.06ms) @ Accel:32 Loops:1024 Thr:256 Vec:1
Speed.#5.........: 68513.2 MH/s (20.67ms) @ Accel:16 Loops:1024 Thr:512 Vec:1
Speed.#6.........: 70855.5 MH/s (19.97ms) @ Accel:32 Loops:1024 Thr:256 Vec:1
Speed.#7.........: 68920.2 MH/s (20.54ms) @ Accel:16 Loops:1024 Thr:512 Vec:1
Speed.#8.........: 69571.2 MH/s (20.37ms) @ Accel:32 Loops:1024 Thr:256 Vec:1
Speed.#9.........: 69949.3 MH/s (20.25ms) @ Accel:32 Loops:1024 Thr:256 Vec:1
Speed.#10.........: 70054.3 MH/s (20.25ms) @ Accel:32 Loops:1024 Thr:256 Vec:1
Speed.#11.........: 71619.3 MH/s (19.80ms) @ Accel:32 Loops:1024 Thr:256 Vec:1
Speed.#12.........: 69329.9 MH/s (20.45ms) @ Accel:16 Loops:1024 Thr:512 Vec:1
Speed.#13.........: 2922.2 MH/s (4.96ms) @ Accel:1024 Loops:128 Thr:1 Vec:8
Speed.#*.........: 845.9 GH/s

---------------------------
* Hash-Mode 1400 (SHA2-256)
---------------------------

Speed.#1.........: 28719.4 MH/s (49.48ms) @ Accel:8 Loops:1024 Thr:1024 Vec:1
Speed.#2.........: 28513.0 MH/s (49.84ms) @ Accel:8 Loops:1024 Thr:1024 Vec:1
Speed.#3.........: 28672.4 MH/s (49.57ms) @ Accel:8 Loops:1024 Thr:1024 Vec:1
Speed.#4.........: 28379.4 MH/s (50.07ms) @ Accel:8 Loops:1024 Thr:1024 Vec:1
Speed.#5.........: 27677.8 MH/s (51.36ms) @ Accel:8 Loops:1024 Thr:1024 Vec:1
Speed.#6.........: 28522.5 MH/s (49.82ms) @ Accel:8 Loops:1024 Thr:1024 Vec:1
Speed.#7.........: 27849.2 MH/s (51.03ms) @ Accel:8 Loops:1024 Thr:1024 Vec:1
Speed.#8.........: 27922.1 MH/s (50.89ms) @ Accel:8 Loops:1024 Thr:1024 Vec:1
Speed.#9.........: 28150.9 MH/s (50.48ms) @ Accel:8 Loops:1024 Thr:1024 Vec:1
Speed.#10.........: 28146.3 MH/s (50.49ms) @ Accel:8 Loops:1024 Thr:1024 Vec:1
Speed.#11.........: 28787.3 MH/s (49.36ms) @ Accel:8 Loops:1024 Thr:1024 Vec:1
Speed.#12.........: 27959.8 MH/s (50.83ms) @ Accel:8 Loops:1024 Thr:1024 Vec:1
Speed.#13.........: 1177.8 MH/s (13.38ms) @ Accel:1024 Loops:128 Thr:1 Vec:8
Speed.#*.........: 340.5 GH/s

---------------------------
* Hash-Mode 1700 (SHA2-512)
---------------------------

Speed.#1.........: 10055.7 MH/s (70.68ms) @ Accel:8 Loops:1024 Thr:512 Vec:1
Speed.#2.........: 10011.1 MH/s (71.07ms) @ Accel:8 Loops:1024 Thr:512 Vec:1
Speed.#3.........: 10093.6 MH/s (70.49ms) @ Accel:8 Loops:1024 Thr:512 Vec:1
Speed.#4.........: 9953.1 MH/s (71.40ms) @ Accel:8 Loops:1024 Thr:512 Vec:1
Speed.#5.........: 10016.3 MH/s (71.03ms) @ Accel:8 Loops:1024 Thr:512 Vec:1
Speed.#6.........: 10080.3 MH/s (70.57ms) @ Accel:8 Loops:1024 Thr:512 Vec:1
Speed.#7.........: 9892.2 MH/s (71.91ms) @ Accel:8 Loops:1024 Thr:512 Vec:1
Speed.#8.........: 10016.4 MH/s (71.03ms) @ Accel:8 Loops:1024 Thr:512 Vec:1
Speed.#9.........: 10081.9 MH/s (70.54ms) @ Accel:8 Loops:1024 Thr:512 Vec:1
Speed.#10.........: 10142.1 MH/s (70.11ms) @ Accel:8 Loops:1024 Thr:512 Vec:1
Speed.#11.........: 10099.9 MH/s (70.43ms) @ Accel:8 Loops:1024 Thr:512 Vec:1
Speed.#12.........: 10077.8 MH/s (70.47ms) @ Accel:8 Loops:1024 Thr:512 Vec:1
Speed.#13.........: 453.6 MH/s (36.32ms) @ Accel:1024 Loops:128 Thr:1 Vec:4
Speed.#*.........: 121.0 GH/s
```





VanitySearchによるBitcoinアドレスの探索









任意のプレフィックスから始まるBitcoinをGPUで探索できるツール「VanitySearch」を実行してみます。

Linux向けバイナリは配布されていない上,Dockerのセットアップも面倒なので,ここではソースから直接ビルドして導入します。

```Bash
apt-get install -y --no-install-recommends build-essential git
git clone https://github.com/JeanLucPons/VanitySearch.git
cd VanitySearch
grep -q 'include' Timer.h || sed -i '0,/#include/ s//#include\n#include/' Timer.h
grep -q 'include' hash/sha256.h || sed -i '0,/#include/ s//#include\n#include/' hash/sha256.h
grep -q 'include' hash/sha256.cpp || sed -i '0,/#include "sha256.h"/ s//#include "sha256.h"\n#include/' hash/sha256.cpp
grep -q 'include' hash/sha512.h || sed -i '0,/#include/ s//#include\n#include/' hash/sha512.h
grep -q 'include' hash/sha512.cpp || sed -i '0,/#include "sha512.h"/ s//#include "sha512.h"\n#include/' hash/sha512.cpp
export CUDA=/usr/local/cuda
export CXXCUDA=$(which g++)
make clean
make gpu=1 CCAP=12.0 CUDA="$CUDA" CXXCUDA="$CXXCUDA" all
export LD_LIBRARY_PATH="$CUDA/lib64:${LD_LIBRARY_PATH}"
```





次のように実行ができます。ここではGPU 12枚とCPUの127スレッド使用して,「1ActiveTK」から始まるアドレスを探しています。

(本当はGPU通信用にCPUのスレッドをもう少し減らした方が早いみたいです)

```Bash
$ ./VanitySearch -gpu -gpuId "$(seq -s, 0 11)" -t 127 -stop 1ActiveTK

VanitySearch v1.19
Difficulty: 51529903411245
Search: 1ActiveTK [Compressed]
Start Sun Aug 10 03:14:50 2025
Base Key: 52D2007CF165951D04DC5BDC4E48D5002E653D70FBE007946959C16F40D5C2AA
Number of CPU thread: 127
GPU: GPU #0 NVIDIA GeForce RTX 5090 (170x0 cores) Grid(1360x128)
GPU: GPU #3 NVIDIA GeForce RTX 5090 (170x0 cores) Grid(1360x128)
GPU: GPU #8 NVIDIA GeForce RTX 5090 (170x0 cores) Grid(1360x128)
GPU: GPU #1 NVIDIA GeForce RTX 5090 (170x0 cores) Grid(1360x128)
GPU: GPU #2 NVIDIA GeForce RTX 5090 (170x0 cores) Grid(1360x128)
GPU: GPU #9 NVIDIA GeForce RTX 5090 (170x0 cores) Grid(1360x128)
GPU: GPU #4 NVIDIA GeForce RTX 5090 (170x0 cores) Grid(1360x128)
GPU: GPU #10 NVIDIA GeForce RTX 5090 (170x0 cores) Grid(1360x128)
GPU: GPU #7 NVIDIA GeForce RTX 5090 (170x0 cores) Grid(1360x128)
GPU: GPU #11 NVIDIA GeForce RTX 5090 (170x0 cores) Grid(1360x128)
GPU: GPU #5 NVIDIA GeForce RTX 5090 (170x0 cores) Grid(1360x128)
GPU: GPU #6 NVIDIA GeForce RTX 5090 (170x0 cores) Grid(1360x128)
[129676.27 Mkey/s][GPU 129465.61 Mkey/s][Total 2^45.25][Prob 55.6%][60% in 00:00:41][Found 0]
PubAddress: 1ActiveTKhrXAmAtdmEooo3ztDxNDuKkaJ
Priv (WIF): (redacted)
Priv (HEX): (redacted)
```





130 Gkey/sというのはとても爆速ですね。手元の RTX 4070 1枚だと3 Gkey/s程度のレートなので,RTX 4070 40枚分近い計算速度ということになります。

約5分で8文字のプレフィックスつきアドレスを発見することができました。






最後に









参考までに,このインスタンスを立ち上げから削除まで15分かかったので,費用は200円弱でした。わずか数百円単位の金額で,私のような普通の高校生がPFLOPS級の環境を利用できるのはとても驚きです。

中学生のとき富岳を利用したいと考えていたところ「それで,研究テーマは何だ?」と問い詰められた覚えがあるので,大学・研究所や企業に所属していなくても利用できるスーパーコンピュータ的な環境はありがたいですね。

さらにいろいろと実行してみたいCUDAの自作プログラムがあるので,機会があれば試してみたいと思います。

vast[.]ai,ぜひ試してみてください(ただしクラウド破産には気を付けて;)。