コンテンツにスキップ

EvoSpikeNet NVIDIA NGC Jupyter Notebook セットアップガイド

[!NOTE] 最新の実装状況は 機能実装ステータス (Remaining Functionality) を参照してください。

このガイドでは、NVIDIA NGCの事前構築済みJupyter Notebookコンテナを使用してEvoSpikeNetを実行する方法を説明します。

概要

NVIDIA NGCは、CUDA、cuDNN、ディープラーニングフレームワークがプリインストールされた最適化されたコンテナを提供します。PyTorch Jupyter Notebookコンテナをベースとして、その上にEvoSpikeNetをインストールします。

前提条件

  • CUDAをサポートするNVIDIA GPU
  • Dockerがインストールされていること
  • NGCアカウント(オプションですが、最新イメージには推奨)
  • 最低16GBのRAMを推奨

クイックスタート

1. リポジトリのクローン

git clone https://github.com/moonlight-tech/EvoSpikeNet.git
cd EvoSpikeNet

2. 環境設定

NGC固有の設定のための.envファイルを作成します:

# NGC設定
NGC_PYTORCH_TAG=26.01-py3
NGC_BASE_IMAGE=nvcr.io/nvidia/pytorch:${NGC_PYTORCH_TAG}

# Jupyter設定
JUPYTER_PORT=8888
JUPYTER_TOKEN=evospikenet-ngc

# EvoSpikeNet設定
EVOSPIKENET_API_KEY=your-api-key-here
BUILD_TARGET=development
ENABLE_GPU=true

3. NGCコンテナでの起動

# NGCベースのノートブックをビルドして実行
docker-compose -f docker-compose.ngc.yml up -d ngc-notebook

# またはフルスタック実行(API/DBサービスも必要な場合)
docker-compose -f docker-compose.ngc.yml --profile full up -d

4. Jupyter Notebookへのアクセス

ブラウザで以下のURLにアクセスしてください:http://localhost:8888

トークンを使用:evospikenet-ngc(またはJUPYTER_TOKENで設定した値)

設定ファイル

Dockerfile.ngc

このDockerfileはNGC PyTorchコンテナを拡張し、EvoSpikeNetの依存関係を追加します。

docker-compose.ngc.yml

NGCコンテナ専用に特化したDocker Compose設定です。

利用可能なNGCイメージ

NVIDIA NGCは複数のPyTorch Jupyterコンテナを提供しています:

  • nvcr.io/nvidia/pytorch:26.01-py3 - 最新の安定版
  • nvcr.io/nvidia/pytorch:25.12-py3 - 前のバージョン
  • nvcr.io/nvidia/pytorch:24.01-py3 - LTSバージョン

CUDAドライバーの互換性に基づいて適切なタグを選択してください。

GPUメモリ要件

  • 最小: 8GB GPU RAM
  • 推奨: 16GB+ GPU RAM
  • 大規模トレーニング用: 24GB+ GPU RAM

トラブルシューティング

コンテナが起動しない場合

GPUの利用可能性を確認:

nvidia-smi
docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi

Jupyterが読み込まれない場合

コンテナログを確認:

docker-compose -f docker-compose.ngc.yml logs ngc-notebook

インポートエラー

すべての依存関係がインストールされていることを確認:

docker-compose -f docker-compose.ngc.yml exec ngc-notebook pip list | grep torch

高度な使用方法

カスタムNGCイメージ

異なるNGCイメージを使用するには、.envファイルのNGC_BASE_IMAGEを変更してください。

開発モード

ライブコードリロードでの開発用:

docker-compose -f docker-compose.ngc.yml up -d ngc-dev

フルスタックデプロイメント

NGCで完全なEvoSpikeNetスタックを実行:

# すべてのサービスを開始
docker-compose -f docker-compose.ngc.yml --profile full up -d

# 起動されるサービス:
# - ngc-notebook: NGC PyTorchを使用したJupyter (port 8888)
# - api: FastAPIバックエンド (port 8000)
# - frontend: Web UI (port 8050)
# - postgres: データベース
# - milvus: ベクトルデータベース
# - elasticsearch: 検索エンジン
# - zenoh-router: 分散メッセージング

クラウド環境でのデプロイメント

NGC Container Registry へのイメージのプッシュ

カスタマイズしたEvoSpikeNet NGCイメージをNVIDIA NGC Container Registryにプッシュして、クラウド環境で利用できるようにします。

1. イメージのビルド

# EvoSpikeNetリポジトリのルートディレクトリで実行
docker build -f Dockerfile.ngc -t evospikenet-ngc:latest .

# または特定のNGC PyTorchバージョンを指定
docker build -f Dockerfile.ngc \
  --build-arg NGC_PYTORCH_TAG=26.01-py3 \
  -t evospikenet-ngc:26.01 .

2. NGC Registry へのログイン

# NGC APIキーを使用してログイン
docker login nvcr.io

# Username: $oauthtoken
# Password: <your-ngc-api-key>

NGC APIキーは NGC Dashboard で生成できます。

3. イメージのタグ付けとプッシュ

# NGC組織名とイメージ名でタグ付け
docker tag evospikenet-ngc:latest nvcr.io/<your-org>/evospikenet:latest
docker tag evospikenet-ngc:latest nvcr.io/<your-org>/evospikenet:26.01

# NGC Registryにプッシュ
docker push nvcr.io/<your-org>/evospikenet:latest
docker push nvcr.io/<your-org>/evospikenet:26.01

AWS での実行

EC2 インスタンス(GPU対応)での実行

# NVIDIA Container Toolkitがインストールされている前提
# NGC イメージをプルして実行
docker run --gpus all -d \
  -p 8888:8888 \
  -v /home/ubuntu/evospikenet-data:/home/appuser/app/saved_models \
  -e JUPYTER_TOKEN=your-secure-token \
  -e EVOSPIKENET_API_KEY=your-api-key \
  --name evospikenet-ngc \
  nvcr.io/<your-org>/evospikenet:latest \
  jupyter lab --ip=0.0.0.0 --port=8888 --no-browser \
    --ServerApp.token=your-secure-token \
    --ServerApp.allow_origin='*'

# ログの確認
docker logs -f evospikenet-ngc

Amazon ECS での実行

ECSタスク定義の例(JSON):

{
  "family": "evospikenet-ngc",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["EC2"],
  "containerDefinitions": [
    {
      "name": "evospikenet",
      "image": "nvcr.io/<your-org>/evospikenet:latest",
      "memory": 16384,
      "cpu": 4096,
      "essential": true,
      "portMappings": [
        {
          "containerPort": 8888,
          "protocol": "tcp"
        }
      ],
      "environment": [
        {"name": "JUPYTER_TOKEN", "value": "your-secure-token"},
        {"name": "EVOSPIKENET_API_KEY", "value": "your-api-key"},
        {"name": "NVIDIA_VISIBLE_DEVICES", "value": "all"}
      ],
      "resourceRequirements": [
        {
          "type": "GPU",
          "value": "1"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/evospikenet-ngc",
          "awslogs-region": "us-east-1",
          "awslogs-stream-prefix": "ecs"
        }
      }
    }
  ]
}

Azure での実行

Azure Container Instances(GPU対応)での実行

# Azure CLIでコンテナを作成
az container create \
  --resource-group evospikenet-rg \
  --name evospikenet-ngc \
  --image nvcr.io/<your-org>/evospikenet:latest \
  --cpu 4 \
  --memory 16 \
  --gpu-count 1 \
  --gpu-sku V100 \
  --ports 8888 \
  --dns-name-label evospikenet-ngc \
  --environment-variables \
    JUPYTER_TOKEN=your-secure-token \
    EVOSPIKENET_API_KEY=your-api-key \
    NVIDIA_VISIBLE_DEVICES=all \
  --restart-policy OnFailure

# コンテナのステータス確認
az container show \
  --resource-group evospikenet-rg \
  --name evospikenet-ngc \
  --query "{Status:instanceView.state,IP:ipAddress.ip,Ports:ipAddress.ports}" \
  --output table

# ログの確認
az container logs \
  --resource-group evospikenet-rg \
  --name evospikenet-ngc

Azure Kubernetes Service (AKS) での実行

デプロイメントマニフェスト(evospikenet-ngc-deployment.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: evospikenet-ngc
spec:
  replicas: 1
  selector:
    matchLabels:
      app: evospikenet-ngc
  template:
    metadata:
      labels:
        app: evospikenet-ngc
    spec:
      containers:
      - name: evospikenet
        image: nvcr.io/<your-org>/evospikenet:latest
        ports:
        - containerPort: 8888
        env:
        - name: JUPYTER_TOKEN
          valueFrom:
            secretKeyRef:
              name: evospikenet-secrets
              key: jupyter-token
        - name: EVOSPIKENET_API_KEY
          valueFrom:
            secretKeyRef:
              name: evospikenet-secrets
              key: api-key
        resources:
          limits:
            nvidia.com/gpu: 1
            memory: "16Gi"
            cpu: "4"
          requests:
            nvidia.com/gpu: 1
            memory: "8Gi"
            cpu: "2"
        volumeMounts:
        - name: models-storage
          mountPath: /home/appuser/app/saved_models
      volumes:
      - name: models-storage
        persistentVolumeClaim:
          claimName: evospikenet-models-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: evospikenet-ngc-service
spec:
  type: LoadBalancer
  ports:
  - port: 8888
    targetPort: 8888
  selector:
    app: evospikenet-ngc

デプロイ手順:

# Secretの作成
kubectl create secret generic evospikenet-secrets \
  --from-literal=jupyter-token=your-secure-token \
  --from-literal=api-key=your-api-key

# デプロイ
kubectl apply -f evospikenet-ngc-deployment.yaml

# ステータス確認
kubectl get pods -l app=evospikenet-ngc
kubectl get svc evospikenet-ngc-service

Google Cloud Platform (GCP) での実行

Compute Engine(GPU対応VM)での実行

# GCEインスタンスにSSH接続後、NVIDIA Container Toolkitがインストールされている前提
# NGC イメージを実行
docker run --gpus all -d \
  -p 8888:8888 \
  -v /mnt/disks/evospikenet-data:/home/appuser/app/saved_models \
  -e JUPYTER_TOKEN=your-secure-token \
  -e EVOSPIKENET_API_KEY=your-api-key \
  --name evospikenet-ngc \
  nvcr.io/<your-org>/evospikenet:latest \
  jupyter lab --ip=0.0.0.0 --port=8888 --no-browser \
    --ServerApp.token=your-secure-token

# ファイアウォールルールの設定(初回のみ)
gcloud compute firewall-rules create allow-jupyter \
  --allow tcp:8888 \
  --source-ranges 0.0.0.0/0 \
  --description "Allow Jupyter access"

Google Kubernetes Engine (GKE) での実行

# GKEクラスタの作成(GPU対応)
gcloud container clusters create evospikenet-cluster \
  --accelerator type=nvidia-tesla-v100,count=1 \
  --machine-type n1-standard-4 \
  --num-nodes 2 \
  --zone us-central1-a

# NVIDIA GPU device pluginのインストール
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml

# Secretの作成
kubectl create secret generic evospikenet-secrets \
  --from-literal=jupyter-token=your-secure-token \
  --from-literal=api-key=your-api-key

# EvoSpikeNetのデプロイ
kubectl run evospikenet-ngc \
  --image=nvcr.io/<your-org>/evospikenet:latest \
  --port=8888 \
  --limits='nvidia.com/gpu=1' \
  --env="JUPYTER_TOKEN=your-secure-token" \
  --env="EVOSPIKENET_API_KEY=your-api-key"

# サービスの公開
kubectl expose pod evospikenet-ngc \
  --type=LoadBalancer \
  --port=8888 \
  --target-port=8888

# 外部IPの確認
kubectl get service evospikenet-ngc

Kubernetes での高度なデプロイメント

プロダクション対応のKubernetesマニフェスト(evospikenet-production.yaml):

apiVersion: v1
kind: Namespace
metadata:
  name: evospikenet

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: evospikenet-config
  namespace: evospikenet
data:
  LOG_LEVEL: "INFO"
  PYTHONPATH: "/home/appuser/app"
  TZ: "Asia/Tokyo"

---
apiVersion: v1
kind: Secret
metadata:
  name: evospikenet-secrets
  namespace: evospikenet
type: Opaque
stringData:
  jupyter-token: "your-secure-token-here"
  api-key: "your-secure-api-key-here"

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: evospikenet-models-pvc
  namespace: evospikenet
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Gi
  storageClassName: standard

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: evospikenet-ngc
  namespace: evospikenet
spec:
  replicas: 1
  selector:
    matchLabels:
      app: evospikenet-ngc
  template:
    metadata:
      labels:
        app: evospikenet-ngc
    spec:
      containers:
      - name: evospikenet
        image: nvcr.io/<your-org>/evospikenet:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8888
          name: jupyter
        env:
        - name: JUPYTER_TOKEN
          valueFrom:
            secretKeyRef:
              name: evospikenet-secrets
              key: jupyter-token
        - name: EVOSPIKENET_API_KEY
          valueFrom:
            secretKeyRef:
              name: evospikenet-secrets
              key: api-key
        envFrom:
        - configMapRef:
            name: evospikenet-config
        resources:
          limits:
            nvidia.com/gpu: 1
            memory: "32Gi"
            cpu: "8"
          requests:
            nvidia.com/gpu: 1
            memory: "16Gi"
            cpu: "4"
        volumeMounts:
        - name: models-storage
          mountPath: /home/appuser/app/saved_models
        - name: logs-storage
          mountPath: /home/appuser/app/logs
        livenessProbe:
          httpGet:
            path: /login
            port: 8888
          initialDelaySeconds: 60
          periodSeconds: 30
          timeoutSeconds: 10
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /login
            port: 8888
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 5
          failureThreshold: 3
      volumes:
      - name: models-storage
        persistentVolumeClaim:
          claimName: evospikenet-models-pvc
      - name: logs-storage
        emptyDir: {}
      nodeSelector:
        cloud.google.com/gke-accelerator: nvidia-tesla-v100  # GPU対応ノードを選択

---
apiVersion: v1
kind: Service
metadata:
  name: evospikenet-ngc-service
  namespace: evospikenet
spec:
  type: LoadBalancer
  ports:
  - port: 8888
    targetPort: 8888
    protocol: TCP
    name: jupyter
  selector:
    app: evospikenet-ngc

---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: evospikenet-ngc-hpa
  namespace: evospikenet
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: evospikenet-ngc
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

デプロイ手順:

# マニフェストの適用
kubectl apply -f evospikenet-production.yaml

# デプロイメントの確認
kubectl get all -n evospikenet

# ログの確認
kubectl logs -n evospikenet -l app=evospikenet-ngc -f

# 外部IPの取得
kubectl get svc -n evospikenet evospikenet-ngc-service

本番環境のセキュリティ設定

環境変数のセキュアな管理

# Kubernetes Secretsの使用
kubectl create secret generic evospikenet-secrets \
  --from-literal=jupyter-token=$(openssl rand -base64 32) \
  --from-literal=api-key=$(openssl rand -base64 32) \
  --namespace evospikenet

# AWS Secrets Managerの使用(ECS/EKS)
aws secretsmanager create-secret \
  --name evospikenet/jupyter-token \
  --secret-string $(openssl rand -base64 32)

aws secretsmanager create-secret \
  --name evospikenet/api-key \
  --secret-string $(openssl rand -base64 32)

HTTPSの有効化

Nginx Ingress Controllerを使用した例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: evospikenet-ingress
  namespace: evospikenet
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - evospikenet.yourdomain.com
    secretName: evospikenet-tls
  rules:
  - host: evospikenet.yourdomain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: evospikenet-ngc-service
            port:
              number: 8888

ネットワークポリシー

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: evospikenet-network-policy
  namespace: evospikenet
spec:
  podSelector:
    matchLabels:
      app: evospikenet-ngc
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: evospikenet
    ports:
    - protocol: TCP
      port: 8888
  egress:
  - to:
    - namespaceSelector: {}
    ports:
    - protocol: TCP
      port: 443
    - protocol: TCP
      port: 80

モニタリングとログ

Prometheus メトリクスの設定

apiVersion: v1
kind: Service
metadata:
  name: evospikenet-metrics
  namespace: evospikenet
  labels:
    app: evospikenet-ngc
  annotations:
    prometheus.io/scrape: "true"
    prometheus.io/port: "9090"
    prometheus.io/path: "/metrics"
spec:
  selector:
    app: evospikenet-ngc
  ports:
  - name: metrics
    port: 9090
    targetPort: 9090

ログ集約(Fluentd経由でElasticsearchへ)

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluentd-config
  namespace: evospikenet
data:
  fluent.conf: |
    <source>
      @type tail
      path /home/appuser/app/logs/*.log
      pos_file /var/log/fluentd-evospikenet.pos
      tag evospikenet.*
      <parse>
        @type json
      </parse>
    </source>

    <match evospikenet.**>
      @type elasticsearch
      host elasticsearch.logging.svc.cluster.local
      port 9200
      logstash_format true
      logstash_prefix evospikenet
    </match>

コスト最適化

スケジューリングによる自動停止・起動

AWS Lambda + EventBridge を使用した例:

import boto3

def lambda_handler(event, context):
    ecs = boto3.client('ecs')

    action = event.get('action', 'stop')
    cluster = 'evospikenet-cluster'
    service = 'evospikenet-ngc-service'

    if action == 'start':
        # サービスのタスク数を1に設定
        ecs.update_service(
            cluster=cluster,
            service=service,
            desiredCount=1
        )
    elif action == 'stop':
        # サービスのタスク数を0に設定
        ecs.update_service(
            cluster=cluster,
            service=service,
            desiredCount=0
        )

    return {'statusCode': 200, 'body': f'Service {action}ped'}

スポットインスタンス/プリエンプティブルVMの使用

GKE でのスポットVMの使用:

gcloud container node-pools create evospikenet-spot-pool \
  --cluster=evospikenet-cluster \
  --spot \
  --accelerator type=nvidia-tesla-v100,count=1 \
  --machine-type=n1-standard-4 \
  --num-nodes=2 \
  --zone=us-central1-a

パフォーマンス最適化

GPU利用

NGCコンテナはNVIDIA GPU用に最適化されています。GPU使用率を監視:

import torch
print(f"CUDA available: {torch.cuda.is_available()}")
print(f"GPU count: {torch.cuda.device_count()}")
print(f"Current GPU: {torch.cuda.get_device_name()}")

メモリ管理

大規模モデル用にPyTorchメモリ設定を調整:

import torch
torch.cuda.set_per_process_memory_fraction(0.8)  # GPUメモリの80%を使用

マルチGPU設定

クラウド環境で複数GPUを使用する場合:

import torch
import torch.nn as nn

# DataParallelの使用
if torch.cuda.device_count() > 1:
    model = nn.DataParallel(model)
    print(f"Using {torch.cuda.device_count()} GPUs")

model.to('cuda')

セキュリティに関する注意事項

  • 本番環境ではデフォルトのJupyterトークンを変更してください
  • EvoSpikeNetサービスには強力なAPIキーを使用してください
  • 本番デプロイメントではネットワーク分離を検討してください

サポート

NGC固有の問題については、以下を参照してください: - NVIDIA NGC ドキュメント - PyTorch NGC コンテナ

EvoSpikeNetの問題については、メインレポジトリのドキュメントを確認してください。 /Users/maoki/Documents/GitHub/EvoSpikeNet/docs/NGC_JUPYTER_SETUP.md