Cloud Workstationsに入門する

# はじめに
Cloud Workstationsの公式ドキュメントを読んで試してみたときのメモです。

# Cloud Workstationsとは
> Cloud Workstations は、Google Cloud 上で、事前構成された、カスタマイズ可能で安全なマネージド開発環境を提供します。Cloud Workstations には、ブラウザベースの IDE、複数のローカルコード エディタ（IntelliJ IDEA Ultimate、VS Code など）または SSH 経由でアクセスできます。 開発環境を手動で設定する代わりに、再現可能な方法で環境を指定するワークステーション構成を作成できます。

[Cloud Workstations のドキュメント](https://cloud.google.com/workstations/docs?hl=ja)

# Cloud Workstationsを利用するメリット
### 1. セットアップの簡便性
Cloud Workstationsは、プリセットされた開発環境やカスタムオプションを通じて、面倒な環境構築プロセスを省略できます。これにより、開発チームはプロジェクトに必要なツールやライブラリが予め構成された環境を迅速に利用開始でき、開発の初期段階での時間と労力を削減します。

### 2. 柔軟性とアクセスの容易さ
クラウドベースで提供されるため、地理的な制約なしにどこからでもアクセス可能です。これにより、リモートワークを推進している企業や、異なる場所にいるチームメンバー間の協力が容易になります。また、異なるデバイスからでも一貫した開発環境にアクセスできるため、作業の柔軟性が向上します。

### 3. スケーラビリティとパフォーマンス
Google Cloudの強力なインフラストラクチャを背景に、必要に応じてリソースを瞬時にスケールアップまたはダウンできます。これにより、プロジェクトの要求が変化しても迅速に対応が可能となり、リソースの無駄遣いを防ぎます。

### 4. コスト効率
物理的なハードウェアへの投資が不要で、使用した分だけの課金が可能です。また、idleTimeoutやrunningTimeoutのような機能を利用して、使用していないリソースに対する費用を抑えることができます。

### 5. セキュリティとコンプライアンス
Google Cloudのセキュリティ基準に準拠しているため、データ保護とプライバシーが確保されます。また、企業のコンプライアンス要件に合わせて環境をカスタマイズできるため、セキュリティリスクを最小限に抑えつつ法規制を遵守することが可能です。

### 6. 継続的なサポートとイノベーション
Google Cloudは定期的に新機能を追加し、プラットフォームを最新の状態に保っています。これにより、最新の開発トレンドに迅速に対応できるだけでなく、技術的な問題に対しても迅速なサポートを受けることが可能です。

### 7. チーム内の一貫性
全ての開発者が同じ環境で作業できるため、チーム内の一貫性が保たれます。これにより、環境差異によるバグの発生を防ぎ、開発プロセスの標準化と効率化が図れます。

# Cloud Workstationsのアーキテクチャ
Cloud Workstationsは、コンピュート、ストレージ、ネットワーキングのリソースを組み合わせて構成されています。基盤となるのはGoogle Compute Engine VMで、ユーザーのニーズに合わせて様々なマシンタイプを選択できます。データはGoogle CloudのPersistent Diskに保存され、セッション間で持続性を保証します。また、Private Service Connectを通じてVPCリソースへのプライベートアクセスを提供し、セキュリティを強化しています。
Workstation cluster: 複数のワークステーションインスタンスをまとめて管理するためのグループまたは集合体
それぞれの要素の関係性: たとえば、ある企業が複数の開発チームを持っているとします。それぞれのチームが異なるプロジェクトに取り組んでいる場合、各チームのニーズに合わせて異なるConfigurationを設定することができます。そして、それぞれのConfigurationに基づいて複数のWorkstationsを作成し、これらを一つのWorkstation clusterで管理することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92368/1613bc60-d73f-4a98-b16f-339e659e4cb3.png)

# （参考）想定する開発フロー
※ MLエンジニアを想定
### 1. 環境のセットアップ
- **プロジェクトの初期化**: Cloud Workstationsのインスタンスを設定し、必要なリソースを選択します。
- **開発ツールのインストール**: 必要なMLライブラリやデータ分析ツールをインストールします。
- **リポジトリのクローン**: プロジェクトのソースコードをCloud Workstationsへクローンします。

### 2. データの準備と探索的データ分析（EDA）
- **データアクセス**: 必要なデータセットをCloud StorageやBigQueryからインポートします。
- **データ前処理**: データクレンジング、正規化、型変換を行います。
- **探索的データ分析（EDA）**: Pandas, Matplotlib, Seabornなどを使用してデータの傾向、パターン、異常値、相関関係を視覚的に分析します。このステップは、後続のモデリング戦略に影響を与える重要な洞察を提供します。

### 3. 実験のセットアップと実行
- **実験の設計**: 実験パラメータとモデルアーキテクチャを定義します。
- **実験管理ツールの利用**: 実験を管理し、結果を追跡します。
- **モデルのトレーニング**: トレーニングプロセスを実行し、モデルを評価します。

### 4. モデルの評価とチューニング
- **パフォーマンス評価**: テストデータセットでモデルの効果を検証します。
- **ハイパーパラメータチューニング**: パフォーマンス向上のためにパラメータを調整します。

# Cloud Workstations環境構築・利用手順
ユーザーはGoogle Cloud Consoleまたはgcloudコマンドラインツールを使用してWorkstations環境を設定できます。プロジェクトの作成後、適切なネットワーク設定とともにワークステーションを定義し、必要に応じてコンテナイメージをデプロイします。これにはオペレーティングシステム、開発ツール、アプリケーションライブラリが含まれ、カスタムイメージの使用も可能です。SSHやHTTP/Sを通じてワークステーションにアクセスし、実際の開発作業を行います。

### 1. Workstation clusterの作成
* Region, Labels, Network settingsくらい
* 20分程度かかります

### 2. Workstation configurationsの作成
* [ワークステーション構成を作成する](https://cloud.google.com/workstations/docs/create-configuration?hl=ja) 参照
    * Workstation cluster（上記）
    * Quick start workstations
    * Auto-sleep
    * Auto-shutdown
    * コンテナイメージ（デフォルト or カスタムをARから指定）
    * Service account
        * このサービスアカウントは Workstation 起動時に使用されるもので、開発環境から各 Google Cloud のサービスにアクセスする際は改めて認証設定が必要です
    * 等

### 3. Workstationsの作成
* Configuration, Environment variables, Labelsくらい = ほぼ設定はconfigurations
    * Environmentはenvに入る

### 4. Workstationsへの接続
コンソールから `Connect to port 80` などで、ブラウザからアクセスできます。また、ローカルのVS CodeからCloud Workstationsへの直接接続をサポートしていて、ローカルIDEの快適さとクラウドのパワーを組み合わせることができます。ローカルVSCodeからのアクセス手順は下記です。
[ローカルの VS Code エディタを使用してコードを開発する](https://cloud.google.com/workstations/docs/develop-code-using-local-vscode-editor?hl=ja)

```
$ gcloud auth login
$ gcloud config set project PROJECT_ID
$ gcloud workstations start-tcp-tunnel \
  --project=PROJECT_ID \
  --region=REGION \
  --cluster=CLUSTER_NAME \
  --config=CONFIG_NAME \
  --local-host-port=:LOCAL_PORT \
  WORKSTATION_NAME 22
# Remote - SSH拡張
# コマンド パレットが開いたら、[ホストに接続する] オプションを選択
# user@localhost:LOCAL_PORT を入力します。LOCAL_PORT はローカル ポート番号に置き換えます
```

さらに、リモートのコンテナに接続する手順は下記です。
VS Codeの「Remote - Containers」拡張機能を利用します。

1. **Remote - Containers 拡張機能のインストール**:
   VS Codeを開いて、拡張機能ビューを表示し（左側のアイコンバーの四角が点線で囲まれたアイコン）、`Remote - Containers`と検索してインストールします。

2. **SSH接続の設定**:
   リモートサーバにSSH経由で接続できるように、`Remote - SSH`拡張機能もインストールします。SSH接続を設定し、リモートサーバにアクセスできることを確認してください。

3. **リモートサーバに接続**:
   VS Codeでコマンドパレット（`F1`キーまたは`Ctrl+Shift+P`）を開き、「Remote-SSH: Connect to Host...」を選択して、接続したいリモートサーバを選びます。

4. **コンテナへの接続**:
   リモートサーバに接続した後、コマンドパレットから「Remote-Containers: Attach to Running Container...」を選択し、開発したいコンテナを選択します。

### 5. （参考）WorkstationsでGeminiを利用する
Gemini Code Assistの利用: AI駆動のコーディングアシスタンスを提供し、コードの自動補完やリファクタリング、バグ検出をサポートします。

[Gemini Code Assist によるコード](https://cloud.google.com/workstations/docs/write-code-gemini?hl=ja)

# Tips
### ストレージ関連
- ディスクの永続化
    - ワークステーションのセッション間でユーザーのデータと設定を保持し、いつでも前回の作業を再開できます。
    - `/home` にマウントされた永続ディスクに保存されます。デフォルトのカレントディレクトリは `/home/user`
    - 削除時にディスクも消すかとか設定できます

### コンテナ関連
- イメージストリーミング
    - 高速起動のためのイメージストリーミング技術を使用し、必要なコンテナイメージを迅速にプルしてワークステーションの起動時間を削減します。
- カスタムコンテナイメージも使用できます
- [ToDo]リソースプール, VMを事前にダウンロード？お金かかる？
    - 逆に古いイメージがpullされないようにするには？

### VS Code関連
- VS Code拡張
    - Cloud Code
    - [ToDo]BQとかGCSをWorkbench同等に扱えるようにする

### Gemini関連
- **cloudcode.duetAI.recitation.maxCitedLength**: ソースコード内の引用の最大長を制御し、適切な引用を促します。
- 引用されたソースに一致するコードが提案されないようにするには、`settings.json` ファイルの `cloudcode.duetAI.recitation.maxCitedLength` 設定を `0` に変更します。
    - [ToDo]ファイルの変更を検知できるか？

### セキュリティ関連
- [ToDo]IAMをはサービスアカウントか個人アカウントか
- サービスアカウント
    - ログとAR、sshするならactAs
- enableAuditAgentで監査ログを取れます

### コスト関連
- コスト
    - 管理費とクラスタ料金
- idleTimeout, runningTimeout: セッション管理を強化し、アイドル状態や実行時間に基づいて自動的にワークステーションを停止させることでコストを節約します。

### その他
- クイックスタートプールサイズ: 頻繁に使用するワークステーションをプールに保持し、需要が高まった際にすぐに利用できるようにします。
    - デフォルトのクイック スタート プールサイズは 1