DawnC commited on
Commit
97f9db7
·
verified ·
1 Parent(s): 6b069f7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +55 -16
app.py CHANGED
@@ -41,6 +41,31 @@ from ultralytics import YOLO
41
  import asyncio
42
  import traceback
43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  history_manager = UserHistoryManager()
45
 
46
  class ModelManager:
@@ -70,28 +95,42 @@ class ModelManager:
70
  self._device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
71
  return self._device
72
 
73
- @property
74
- def yolo_model(self):
75
- if self._yolo_model is None:
76
- self._yolo_model = YOLO('yolov8x.pt')
77
- return self._yolo_model
78
-
79
  # @property
80
  # def yolo_model(self):
81
  # if self._yolo_model is None:
82
  # self._yolo_model = YOLO('yolov8x.pt')
83
-
84
- # if hasattr(self._yolo_model, 'model') and hasattr(self._yolo_model.model, 'fuse'):
85
- # print("avoid CUDA error")
86
-
87
- # def no_fuse(*args, **kwargs):
88
- # print("skip the fuse step")
89
- # return self._yolo_model.model
90
-
91
- # self._yolo_model.model.fuse = no_fuse
92
-
93
  # return self._yolo_model
94
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
  @property
96
  def breed_model(self):
97
  if self._breed_model is None:
 
41
  import asyncio
42
  import traceback
43
 
44
+ def setup_environment():
45
+ """配置適合 ZeroGPU 環境的設置"""
46
+ # 啟用 CUDA 錯誤的同步報告,幫助診斷問題
47
+ os.environ['CUDA_LAUNCH_BLOCKING'] = '1'
48
+
49
+ # 檢查 CUDA 是否可用
50
+ if torch.cuda.is_available():
51
+ # 顯示 GPU 信息
52
+ device_name = torch.cuda.get_device_name(0)
53
+ print(f"使用 GPU: {device_name}")
54
+
55
+ # 針對 A100 的優化設置
56
+ if "A100" in device_name:
57
+ print("檢測到 A100 GPU,應用特殊優化...")
58
+ torch.backends.cudnn.benchmark = True
59
+
60
+ # 清理 GPU 內存
61
+ torch.cuda.empty_cache()
62
+ return True
63
+ else:
64
+ print("CUDA 不可用,使用 CPU 模式")
65
+ return False
66
+
67
+ cuda_available = setup_environment()
68
+
69
  history_manager = UserHistoryManager()
70
 
71
  class ModelManager:
 
95
  self._device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
96
  return self._device
97
 
 
 
 
 
 
 
98
  # @property
99
  # def yolo_model(self):
100
  # if self._yolo_model is None:
101
  # self._yolo_model = YOLO('yolov8x.pt')
 
 
 
 
 
 
 
 
 
 
102
  # return self._yolo_model
103
 
104
+ @property
105
+ def yolo_model(self):
106
+ if self._yolo_model is None:
107
+ try:
108
+ print("正在加載 YOLO 模型...")
109
+ # 不指定設備,讓 YOLO 自動選擇
110
+ self._yolo_model = YOLO('yolov8x.pt')
111
+
112
+ # 禁用模型融合來避免 CUDA 錯誤
113
+ if hasattr(self._yolo_model, 'model') and hasattr(self._yolo_model.model, 'fuse'):
114
+ print("在 ZeroGPU 環境下禁用模型融合以避免 CUDA 錯誤")
115
+
116
+ # 備份原始融合方法
117
+ original_fuse = self._yolo_model.model.fuse
118
+
119
+ # 創建一個空的融合方法
120
+ def no_fuse(*args, **kwargs):
121
+ print("已跳過融合操作")
122
+ return self._yolo_model.model
123
+
124
+ # 替換融合方法
125
+ self._yolo_model.model.fuse = no_fuse
126
+ except Exception as e:
127
+ print(f"加載 YOLO 模型時出錯: {str(e)}")
128
+ print("嘗試降級到較小的模型和 CPU 模式...")
129
+ # 降級到較小的模型並明確使用 CPU
130
+ self._yolo_model = YOLO('yolov8n.pt', device='cpu')
131
+
132
+ return self._yolo_model
133
+
134
  @property
135
  def breed_model(self):
136
  if self._breed_model is None: