【TensorDock】個人でGPUサーバーをコスパよく使用する

## 使おうと思った契機
友達がGPUを使用するtoolを使用しながらだと生成AIがすごく遅い、と言ってたので良い外部GPUサーバーがないか調べてみました。

## なぜ？
- 国内サービスでは個人向けの選択肢が少ない  
- オーバースペックすぎるサービスが多い（Xserverが150円/hでL4借りることができますがメモリ120GB,cpu24コア）

## TensorDockとは？
TensorDockは、国外のGPUやCPUを搭載したVPSを格安で利用できるサービスです。サーバー自体は、TensorDockが契約しているサプライヤーから提供されています。

### 利用時の注意点
- 各VPSに個別のIPが割り振られていない
- Cloudflareが使用するデフォルトポートが閉じられている場合がある  
- APIが壊れていることが稀にある（使えるのはVMのstartとstopぐらい）  
- ログインセッションがサブドメインと混同され、二重ログインのような挙動をすることがある  
- サポートのレスポンスが遅い（実際はDiscordサーバーの有志がメインでサポートしている印象）  

### それでも使う理由
これらの問題を全て凌駕するほど安い！
TensordockならL4が50円/h以下ぐらいで借りられます。

## 利用方法

### 1. 会員登録
- TensorDock公式サイトでアカウントを作成。（https://www.tensordock.com/）
- 税制に関する警告がありますが、日本の（特に個人）ユーザーには特に影響はないため無視して問題ないです。 
- SSHキーを登録し、接続確認をします。登録した時点でたぶんできます。

```shell
curl --location --request POST 'https://dashboard.tensordock.com/api/v0/auth/test' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'api_key=API_KEY_HERE' \
--data-urlencode 'api_token=API_TOKEN_HERE'
```

### 2. デポジット（Deposit）
- サーバーを使用するには、事前に資金をチャージする必要があります。
- 資金が尽きるとサーバーが削除されるため注意してください。  
（自分のミスの可能性もありますが、一度stopしたにも関わらず請求が発生し続けた事がありましたので大量の入金はおすすめしません。）

### 3. サーバーデプロイ
#### GPUモデルを選択
- 用途に応じたGPUを選択します。  
- わからない場合は、Consumer-gradeの安価なものがおすすめです。性能が自分のPCと比較しやすいです。  

#### ロケーションを選択
- ロケーションによって性能や接続状況に差があるため、初めてのデプロイ後にチェックすることをおすすめします。  
- 近い場所を選ぶのが基本ですが、アジア地域のサーバーは少なく、遠方になることが多いです。  

#### 他のスペック
- ロケーションを選択すると最低値が表示されます。用途に合わせて調整しましょう。  
- 例: GPU 1、メモリ 16GB、CPU 2コア、SSD 50G（tensorflowやpytorchをいれるなら40G+推奨)
- **注意:** SSDは増加のみ可能で、削減はできません。

#### OSを選択
- TensorFlowやPyTorchがインストールされたOSはSSD容量を大きく消費します。  
- 私はUbuntu 22.04を選択し、必要な環境を後で手動で整えています。  

#### その他設定
- **Administrator username**: SSH接続時のデフォルトユーザー名。sudoパスワードは空文字がデフォルト。  
- **Administrator password**: SSHキーを登録していれば不要。  
- **Name**: 任意の名前を設定できます。この名前はTensorDock内でのみ表示されます。  
- **Configure port forwards**: 各VPSに個別のIPが割り振られていないため、ポートフォワーディングが必要です。80や443を内部ポートとして設定するのが無難です。  
- **Payment option**:  
  - On-demand（都度払い。事前にデポジットが必要）  
  - Subscription（定期支払い。デポジット不要だがメリットは不明）  

#### デプロイと確認
- デプロイ後、約5分でサーバーが準備完了します。  
- 以下を確認します:  
  - Pingでサーバーまでの到達秒数を確認します。オランダで231msとかでした。
      ```
      ping -c 4 {ホストIPアドレス}
      ```
  - SSH接続 
      ```
      ssh -p {22にforwardされてるport} {default_user名}@{ホストIPアドレス}
      ```
  - `nvidia-smi` コマンドの結果、このように表示されればGPUが認識されています。
      ![スクリーンショット 2024-11-21 015428.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192330/43ad1449-531a-33eb-a82f-6ef798e6a2c6.png)

## Actions（操作）
- **Modify configuration**  
  - VMが止まっているときのみ操作可能です。
  - サーバー停止中にスペックを調整可能です。  
  - GPUを0に設定すれば、GPUを使わずにサーバーを起動させることも可能です。  

- **Stop (resources reserve)**  
  - リソースを保持したままサーバーを停止します。再起動時のリソース確保が保証されます。  

- **Stop (resources disassociated)**  
  - リソースを解放してサーバーを停止します。再起動時にリソースが埋まっている場合、起動できない可能性があります。  

- **Convert to spot instance**  
  - 入札型のインスタンスに切り替えることで、コストをさらに削減可能です。
  - 詳細は公式ドキュメントを参照してください: [Spot Instances](https://docs.tensordock.com/virtual-machines/spot-instances)  

- **Delete Virtual Machine**  
  - 確認が1回のみで、よくある「削除と入力してください」のような仕組みがないため、誤操作に注意してください。自動化しないなら気合をいれて環境構築するのはおすすめしません。

## まとめ
いろいろと不便点はありますが、昨今のローカルでGPUを使用するツールやお手軽localAIの増加に対しての需要がありそうなので書いてみました。
自分は生成AIをおいてAPIで処理だけ外部になげる構築にしてます。