kofdai commited on
Commit
683a5fe
·
verified ·
1 Parent(s): f14db92

Add SPACES_DEPLOYMENT_GUIDE.md for HuggingFace Spaces deployment

Browse files
Files changed (1) hide show
  1. SPACES_DEPLOYMENT_GUIDE.md +560 -0
SPACES_DEPLOYMENT_GUIDE.md ADDED
@@ -0,0 +1,560 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # HuggingFace Spacesへのデプロイガイド
2
+
3
+ このガイドでは、NullAI Phi-4 14B プロジェクトをHuggingFace Spacesにデプロイする方法を説明します。
4
+
5
+ ## 目次
6
+
7
+ 1. [デプロイ方法の選択](#デプロイ方法の選択)
8
+ 2. [方法1: Docker Space (推奨)](#方法1-docker-space-推奨)
9
+ 3. [方法2: Gradio Space](#方法2-gradio-space)
10
+ 4. [トラブルシューティング](#トラブルシューティング)
11
+
12
+ ---
13
+
14
+ ## デプロイ方法の選択
15
+
16
+ ### 方法1: Docker Space (推奨)
17
+ - ✅ フルスタックアプリケーション(FastAPI + React)
18
+ - ✅ 完全なカスタマイズ可能
19
+ - ✅ 本番環境に最適
20
+ - ⚠️ より多くのリソースが必要
21
+
22
+ ### 方法2: Gradio Space
23
+ - ✅ セットアップが簡単
24
+ - ✅ 軽量
25
+ - ✅ プロトタイプに最適
26
+ - ⚠️ UIのカスタマイズが制限される
27
+
28
+ ---
29
+
30
+ ## 方法1: Docker Space (推奨)
31
+
32
+ ### ステップ1: Dockerfileの作成
33
+
34
+ プロジェクトルートに`Dockerfile`を作成します:
35
+
36
+ ```dockerfile
37
+ # Multi-stage build for optimized image size
38
+ FROM node:18-alpine AS frontend-builder
39
+
40
+ WORKDIR /app/frontend
41
+
42
+ # Copy frontend files
43
+ COPY frontend/package*.json ./
44
+ RUN npm ci
45
+
46
+ COPY frontend/ ./
47
+ RUN npm run build
48
+
49
+ # Python backend stage
50
+ FROM python:3.11-slim
51
+
52
+ WORKDIR /app
53
+
54
+ # Install system dependencies
55
+ RUN apt-get update && apt-get install -y \
56
+ gcc \
57
+ g++ \
58
+ make \
59
+ && rm -rf /var/lib/apt/lists/*
60
+
61
+ # Copy backend files
62
+ COPY backend/requirements.txt ./backend/
63
+ RUN pip install --no-cache-dir -r backend/requirements.txt
64
+
65
+ # Copy backend code
66
+ COPY backend/ ./backend/
67
+
68
+ # Copy frontend build
69
+ COPY --from=frontend-builder /app/frontend/dist ./frontend/dist
70
+
71
+ # Copy configuration files
72
+ COPY models_config.json domains_config.json null_ai_config.json ./
73
+ COPY db_manager.py inference_engine_unified.py runner_engine.py ./
74
+
75
+ # Create database directory
76
+ RUN mkdir -p /app/data
77
+
78
+ # Set environment variables
79
+ ENV DATABASE_URL=sqlite:////app/data/sql_app.db
80
+ ENV PYTHONPATH=/app
81
+ ENV HOST=0.0.0.0
82
+ ENV PORT=7860
83
+
84
+ # Expose port (HuggingFace Spaces uses 7860)
85
+ EXPOSE 7860
86
+
87
+ # Health check
88
+ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
89
+ CMD python -c "import requests; requests.get('http://localhost:7860/api/system/health')"
90
+
91
+ # Run the application
92
+ CMD ["uvicorn", "backend.app.main:app", "--host", "0.0.0.0", "--port", "7860"]
93
+ ```
94
+
95
+ ### ステップ2: README.mdの更新
96
+
97
+ HuggingFace Spaces用の設定をREADME.mdのヘッダーに追加します:
98
+
99
+ ```yaml
100
+ ---
101
+ title: NullAI Phi-4 14B Knowledge System
102
+ emoji: 🧠
103
+ colorFrom: blue
104
+ colorTo: purple
105
+ sdk: docker
106
+ pinned: false
107
+ license: mit
108
+ app_port: 7860
109
+ ---
110
+ ```
111
+
112
+ ### ステップ3: .dockerignoreの作成
113
+
114
+ ```
115
+ # Git files
116
+ .git
117
+ .gitignore
118
+ .gitattributes
119
+
120
+ # Python
121
+ __pycache__/
122
+ *.py[cod]
123
+ *$py.class
124
+ *.so
125
+ .Python
126
+ env/
127
+ venv/
128
+ .venv/
129
+
130
+ # Node
131
+ node_modules/
132
+ npm-debug.log*
133
+ yarn-debug.log*
134
+ yarn-error.log*
135
+
136
+ # IDE
137
+ .vscode/
138
+ .idea/
139
+ *.swp
140
+ *.swo
141
+
142
+ # OS
143
+ .DS_Store
144
+ Thumbs.db
145
+
146
+ # Database
147
+ *.db
148
+ *.sqlite
149
+
150
+ # Large files
151
+ *.gguf
152
+ *.bin
153
+ *.pth
154
+ phi-4-f16.gguf
155
+
156
+ # Logs
157
+ *.log
158
+
159
+ # Distribution
160
+ dist/
161
+ build/
162
+ ```
163
+
164
+ ### ステップ4: Spacesへのデプロイ
165
+
166
+ #### オプションA: Git経由でデプロイ
167
+
168
+ ```bash
169
+ # 1. HuggingFace Spacesで新しいSpaceを作成
170
+ # https://huggingface.co/spaces にアクセスして "Create new Space" をクリック
171
+ # - Name: nullai-phi-4-knowledge-system
172
+ # - SDK: Docker
173
+ # - Hardware: CPU Basic (または GPU T4)
174
+
175
+ # 2. Spaceのリポジトリをクローン
176
+ git clone https://huggingface.co/spaces/YOUR_USERNAME/nullai-phi-4-knowledge-system
177
+ cd nullai-phi-4-knowledge-system
178
+
179
+ # 3. プロジェクトファイルをコピー
180
+ cp -r /Users/motonishikoudai/project_locate/huggingface_repo/* .
181
+
182
+ # 4. 大きなモデルファイルを除外
183
+ rm -f phi-4-f16.gguf
184
+
185
+ # 5. コミットしてプッシュ
186
+ git add .
187
+ git commit -m "Initial deployment to Spaces"
188
+ git push
189
+ ```
190
+
191
+ #### オプションB: HuggingFace Hub API経由でデプロイ
192
+
193
+ ```python
194
+ from huggingface_hub import HfApi, create_repo
195
+
196
+ api = HfApi(token="YOUR_HF_TOKEN")
197
+
198
+ # Spaceを作成
199
+ repo_id = "YOUR_USERNAME/nullai-phi-4-knowledge-system"
200
+ create_repo(
201
+ repo_id=repo_id,
202
+ repo_type="space",
203
+ space_sdk="docker",
204
+ private=False
205
+ )
206
+
207
+ # ファイルをアップロード
208
+ api.upload_folder(
209
+ folder_path="/Users/motonishikoudai/project_locate/huggingface_repo",
210
+ repo_id=repo_id,
211
+ repo_type="space",
212
+ ignore_patterns=["*.gguf", "*.db", "__pycache__", "node_modules"]
213
+ )
214
+ ```
215
+
216
+ ### ステップ5: 環境変数の設定
217
+
218
+ HuggingFace Spacesの設定画面で環境変数を設定:
219
+
220
+ ```bash
221
+ DATABASE_URL=sqlite:////app/data/sql_app.db
222
+ SECRET_KEY=your-secret-key-here
223
+ CORS_ORIGINS=["https://YOUR_USERNAME-nullai-phi-4-knowledge-system.hf.space"]
224
+ ```
225
+
226
+ ### ステップ6: ハードウェアの選択
227
+
228
+ 推奨ハードウェア:
229
+ - **CPU Basic** (無料): デモ・開発用
230
+ - **CPU Upgrade**: 本番環境・多数の���ーザー
231
+ - **GPU T4**: AIモデル推論が必要な場合
232
+
233
+ ---
234
+
235
+ ## 方法2: Gradio Space
236
+
237
+ より簡単な方法として、Gradioインターフェースでラップしてデプロイすることもできます。
238
+
239
+ ### ステップ1: app.pyの作成
240
+
241
+ ```python
242
+ import gradio as gr
243
+ import requests
244
+ import json
245
+ from typing import List, Dict
246
+ import subprocess
247
+ import os
248
+ import threading
249
+
250
+ # バックエンドサーバーをバックグラウンドで起動
251
+ def start_backend():
252
+ subprocess.Popen([
253
+ "uvicorn",
254
+ "backend.app.main:app",
255
+ "--host", "0.0.0.0",
256
+ "--port", "8000"
257
+ ])
258
+
259
+ # バックエンドを起動
260
+ backend_thread = threading.Thread(target=start_backend, daemon=True)
261
+ backend_thread.start()
262
+
263
+ # APIのベースURL
264
+ API_URL = "http://localhost:8000"
265
+
266
+ def list_knowledge_tiles(domain_id: str = None) -> str:
267
+ """知識タイルのリストを取得"""
268
+ params = {}
269
+ if domain_id:
270
+ params["domain_id"] = domain_id
271
+
272
+ response = requests.get(f"{API_URL}/api/knowledge/", params=params)
273
+
274
+ if response.status_code == 200:
275
+ data = response.json()
276
+ tiles = data.get("tiles", [])
277
+
278
+ result = f"### 知識タイル ({len(tiles)}件)\n\n"
279
+ for tile in tiles[:10]: # 最初の10件のみ表示
280
+ result += f"**{tile['topic']}** ({tile['domain_id']})\n"
281
+ result += f"{tile['content'][:100]}...\n\n"
282
+
283
+ return result
284
+ else:
285
+ return f"エラー: {response.status_code}"
286
+
287
+ def search_knowledge(query: str) -> str:
288
+ """知識を検索"""
289
+ response = requests.get(
290
+ f"{API_URL}/api/knowledge/",
291
+ params={"search": query}
292
+ )
293
+
294
+ if response.status_code == 200:
295
+ data = response.json()
296
+ tiles = data.get("tiles", [])
297
+
298
+ if not tiles:
299
+ return "検索結果が見つかりませんでした。"
300
+
301
+ result = f"### 検索結果: '{query}' ({len(tiles)}件)\n\n"
302
+ for tile in tiles[:5]:
303
+ result += f"**{tile['topic']}**\n"
304
+ result += f"{tile['content']}\n\n"
305
+ result += "---\n\n"
306
+
307
+ return result
308
+ else:
309
+ return f"エラー: {response.status_code}"
310
+
311
+ def create_tile(domain_id: str, topic: str, content: str, token: str) -> str:
312
+ """新しい知識タイルを作成"""
313
+ headers = {"Authorization": f"Bearer {token}"}
314
+ data = {
315
+ "domain_id": domain_id,
316
+ "topic": topic,
317
+ "content": content
318
+ }
319
+
320
+ response = requests.post(
321
+ f"{API_URL}/api/knowledge/",
322
+ headers=headers,
323
+ json=data
324
+ )
325
+
326
+ if response.status_code == 201:
327
+ return "✅ 知識タイルを作成しました!"
328
+ else:
329
+ return f"❌ エラー: {response.text}"
330
+
331
+ # Gradioインターフェース
332
+ with gr.Blocks(title="NullAI Knowledge System", theme=gr.themes.Soft()) as demo:
333
+ gr.Markdown("# 🧠 NullAI Phi-4 14B Knowledge System")
334
+ gr.Markdown("Expert-verified knowledge management with 3D spatial memory")
335
+
336
+ with gr.Tabs():
337
+ # タブ1: 知識の閲覧
338
+ with gr.Tab("📚 知識の閲覧"):
339
+ domain_filter = gr.Dropdown(
340
+ choices=["", "medical", "ai_fundamentals", "logic_reasoning",
341
+ "computer_science_theory", "engineering", "philosophy", "law"],
342
+ label="ドメインでフィルタ",
343
+ value=""
344
+ )
345
+ list_btn = gr.Button("知識タイルを表示")
346
+ list_output = gr.Markdown()
347
+
348
+ list_btn.click(
349
+ fn=list_knowledge_tiles,
350
+ inputs=[domain_filter],
351
+ outputs=[list_output]
352
+ )
353
+
354
+ # タブ2: 検索
355
+ with gr.Tab("🔍 検索"):
356
+ search_input = gr.Textbox(
357
+ label="検索クエリ",
358
+ placeholder="検索したいキーワードを入力..."
359
+ )
360
+ search_btn = gr.Button("検索")
361
+ search_output = gr.Markdown()
362
+
363
+ search_btn.click(
364
+ fn=search_knowledge,
365
+ inputs=[search_input],
366
+ outputs=[search_output]
367
+ )
368
+
369
+ # タブ3: 知識の追加
370
+ with gr.Tab("➕ 知識の追加"):
371
+ gr.Markdown("新しい知識タイルを作成するには、ログインが必要です。")
372
+
373
+ create_domain = gr.Dropdown(
374
+ choices=["medical", "ai_fundamentals", "logic_reasoning"],
375
+ label="ドメイン"
376
+ )
377
+ create_topic = gr.Textbox(label="トピック")
378
+ create_content = gr.Textbox(
379
+ label="内容",
380
+ lines=5,
381
+ placeholder="詳細な説明を入力..."
382
+ )
383
+ create_token = gr.Textbox(
384
+ label="認証トークン",
385
+ type="password",
386
+ placeholder="Bearer トークン"
387
+ )
388
+ create_btn = gr.Button("作成")
389
+ create_output = gr.Markdown()
390
+
391
+ create_btn.click(
392
+ fn=create_tile,
393
+ inputs=[create_domain, create_topic, create_content, create_token],
394
+ outputs=[create_output]
395
+ )
396
+
397
+ gr.Markdown("""
398
+ ---
399
+ ### 🔗 リンク
400
+ - [GitHub](https://github.com/Ag3497120/nullai-phi-4-14b-v2)
401
+ - [Model Card](https://huggingface.co/kofdai/nullai-phi-4-14b-v2)
402
+ - [Documentation](https://huggingface.co/kofdai/nullai-phi-4-14b-v2/blob/main/USER_GUIDE.md)
403
+ """)
404
+
405
+ if __name__ == "__main__":
406
+ demo.launch(server_name="0.0.0.0", server_port=7860)
407
+ ```
408
+
409
+ ### ステップ2: requirements.txtの作成
410
+
411
+ ```txt
412
+ gradio>=4.0.0
413
+ fastapi>=0.104.0
414
+ uvicorn[standard]>=0.24.0
415
+ requests>=2.31.0
416
+ sqlalchemy>=2.0.0
417
+ pydantic>=2.0.0
418
+ pydantic-settings>=2.0.0
419
+ python-multipart>=0.0.6
420
+ python-jose[cryptography]>=3.3.0
421
+ passlib[bcrypt]>=1.7.4
422
+ ```
423
+
424
+ ### ステップ3: README.mdの設定
425
+
426
+ ```yaml
427
+ ---
428
+ title: NullAI Knowledge System
429
+ emoji: 🧠
430
+ colorFrom: blue
431
+ colorTo: purple
432
+ sdk: gradio
433
+ sdk_version: 4.0.0
434
+ app_file: app.py
435
+ pinned: false
436
+ license: mit
437
+ ---
438
+ ```
439
+
440
+ ### ステップ4: デプロイ
441
+
442
+ ```bash
443
+ # Spaceを作成してファイルをアップロード
444
+ git clone https://huggingface.co/spaces/YOUR_USERNAME/nullai-knowledge-system
445
+ cd nullai-knowledge-system
446
+
447
+ # 必要なファイルをコピー
448
+ cp app.py requirements.txt README.md ./
449
+ cp -r backend/ ./
450
+
451
+ git add .
452
+ git commit -m "Deploy Gradio Space"
453
+ git push
454
+ ```
455
+
456
+ ---
457
+
458
+ ## トラブルシューティング
459
+
460
+ ### 問題1: ビルドエラー
461
+
462
+ **症状**: Docker buildが失敗する
463
+
464
+ **解決方法**:
465
+ ```bash
466
+ # ローカルでビルドをテスト
467
+ docker build -t nullai-test .
468
+ docker run -p 7860:7860 nullai-test
469
+ ```
470
+
471
+ ### 問題2: メモリ不足
472
+
473
+ **症状**: "Out of memory" エラー
474
+
475
+ **解決方法**:
476
+ - より大きなハードウェアにアップグレード
477
+ - モデルファイルを除外
478
+ - マルチステージビルドを最適化
479
+
480
+ ### 問題3: 起動が遅い
481
+
482
+ **症状**: アプリケーションの起動に時間がかかる
483
+
484
+ **解決方法**:
485
+ ```dockerfile
486
+ # Dockerfileに以下を追加してキャッシュを活用
487
+ RUN pip install --no-cache-dir -r requirements.txt
488
+ ```
489
+
490
+ ### 問題4: データベース接続エラー
491
+
492
+ **症状**: SQLite database is locked
493
+
494
+ **解決方法**:
495
+ ```bash
496
+ # 環境変数でデータベースパスを設定
497
+ DATABASE_URL=sqlite:////app/data/sql_app.db?check_same_thread=False
498
+ ```
499
+
500
+ ### 問題5: CORS エラー
501
+
502
+ **症状**: フロントエンドからAPIにアクセスできない
503
+
504
+ **解決方法**:
505
+ ```python
506
+ # backend/app/config.py
507
+ CORS_ORIGINS = [
508
+ "https://YOUR_USERNAME-nullai-knowledge-system.hf.space",
509
+ "http://localhost:7860"
510
+ ]
511
+ ```
512
+
513
+ ---
514
+
515
+ ## 高度な設定
516
+
517
+ ### カスタムドメイン
518
+
519
+ HuggingFace Spacesでカスタムドメインを設定:
520
+
521
+ 1. Spaceの設定画面に移動
522
+ 2. "Settings" → "Custom domain"
523
+ 3. ドメイン名を入力
524
+ 4. DNSレコードを設定
525
+
526
+ ### シークレットの管理
527
+
528
+ 機密情報(API キー、データベース認証情報など)は、Spacesのシークレット機能を使用:
529
+
530
+ 1. Space設定 → "Variables and secrets"
531
+ 2. シークレットを追加
532
+ 3. コードで `os.environ.get("SECRET_NAME")` を使用
533
+
534
+ ### 自動再起動
535
+
536
+ Spacesは自動的にクラッシュを検出して再起動しますが、カスタムヘルスチェックを追加することもできます:
537
+
538
+ ```python
539
+ from fastapi import FastAPI
540
+
541
+ app = FastAPI()
542
+
543
+ @app.get("/health")
544
+ def health_check():
545
+ return {"status": "healthy"}
546
+ ```
547
+
548
+ ---
549
+
550
+ ## まとめ
551
+
552
+ どちらの方法でも、NullAI知識管理システムをHuggingFace Spacesにデプロイできます:
553
+
554
+ - **Docker Space**: フルスタック、本番環境向け
555
+ - **Gradio Space**: 簡単、プロトタイプ向け
556
+
557
+ 詳細については、以下を参照してください:
558
+ - [HuggingFace Spaces Documentation](https://huggingface.co/docs/hub/spaces)
559
+ - [Docker Spaces Guide](https://huggingface.co/docs/hub/spaces-sdks-docker)
560
+ - [Gradio Documentation](https://www.gradio.app/docs/)