Spaces:
Running
Running
A Le Thanh Son
commited on
Commit
·
a6403d5
1
Parent(s):
955241f
fix
Browse files- app.py +43 -13
- generator.py +10 -2
app.py
CHANGED
@@ -11,6 +11,9 @@ from dataclasses import dataclass
|
|
11 |
from generator import Segment, load_csm_1b
|
12 |
from huggingface_hub import login
|
13 |
|
|
|
|
|
|
|
14 |
# Kiểm tra xem có GPU không và cấu hình thiết bị phù hợp
|
15 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
16 |
print(f"Sử dụng thiết bị: {device}")
|
@@ -28,17 +31,29 @@ def login_huggingface():
|
|
28 |
# Đăng nhập khi khởi động
|
29 |
login_huggingface()
|
30 |
|
31 |
-
#
|
32 |
generator = None
|
|
|
33 |
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
|
|
|
|
|
|
39 |
print("Đã tải xong mô hình!")
|
40 |
return generator
|
41 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
# Hàm chuyển đổi âm thanh thành tensor
|
43 |
def audio_to_tensor(audio_path: str) -> Tuple[torch.Tensor, int]:
|
44 |
waveform, sample_rate = torchaudio.load(audio_path)
|
@@ -68,8 +83,8 @@ def generate_speech(
|
|
68 |
top_k: int = 50,
|
69 |
progress=gr.Progress()
|
70 |
) -> str:
|
71 |
-
#
|
72 |
-
generator =
|
73 |
|
74 |
# Chuẩn bị ngữ cảnh (context)
|
75 |
context = []
|
@@ -119,8 +134,8 @@ def generate_speech_simple(
|
|
119 |
top_k: int = 50,
|
120 |
progress=gr.Progress()
|
121 |
) -> str:
|
122 |
-
#
|
123 |
-
generator =
|
124 |
|
125 |
progress(0.3, "Đang tạo âm thanh...")
|
126 |
# Tạo âm thanh từ văn bản
|
@@ -282,8 +297,11 @@ def create_demo():
|
|
282 |
ZeroGPU giúp giải phóng bộ nhớ GPU khi không sử dụng, giúp tiết kiệm tài nguyên và cải thiện hiệu suất.
|
283 |
|
284 |
Khi bạn tạo âm thanh, GPU sẽ được sử dụng tự động và giải phóng sau khi hoàn thành.
|
|
|
|
|
285 |
""")
|
286 |
|
|
|
287 |
def check_gpu():
|
288 |
if torch.cuda.is_available():
|
289 |
gpu_name = torch.cuda.get_device_name(0)
|
@@ -296,6 +314,21 @@ def create_demo():
|
|
296 |
gpu_info = gr.Textbox(label="Thông tin GPU", interactive=False)
|
297 |
|
298 |
check_gpu_btn.click(fn=check_gpu, inputs=None, outputs=gpu_info)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
299 |
|
300 |
# Kết nối các thành phần
|
301 |
generate_btn.click(
|
@@ -327,9 +360,6 @@ def create_demo():
|
|
327 |
],
|
328 |
outputs=output_audio_context
|
329 |
)
|
330 |
-
|
331 |
-
# Tải mô hình khi khởi động
|
332 |
-
demo.load(fn=load_model)
|
333 |
|
334 |
return demo
|
335 |
|
|
|
11 |
from generator import Segment, load_csm_1b
|
12 |
from huggingface_hub import login
|
13 |
|
14 |
+
# Tắt tính năng compile của torch để tránh lỗi triton
|
15 |
+
torch._dynamo.config.suppress_errors = True
|
16 |
+
|
17 |
# Kiểm tra xem có GPU không và cấu hình thiết bị phù hợp
|
18 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
19 |
print(f"Sử dụng thiết bị: {device}")
|
|
|
31 |
# Đăng nhập khi khởi động
|
32 |
login_huggingface()
|
33 |
|
34 |
+
# Biến toàn cục để theo dõi trạng thái mô hình
|
35 |
generator = None
|
36 |
+
model_loaded = False
|
37 |
|
38 |
+
# Hàm tải mô hình được gọi trong ZeroGPU
|
39 |
+
@spaces.GPU
|
40 |
+
def initialize_model():
|
41 |
+
global generator, model_loaded
|
42 |
+
if not model_loaded:
|
43 |
+
print("Đang tải mô hình CSM-1B trong GPU...")
|
44 |
+
generator = load_csm_1b(device="cuda")
|
45 |
+
model_loaded = True
|
46 |
print("Đã tải xong mô hình!")
|
47 |
return generator
|
48 |
|
49 |
+
# Hàm lấy mô hình đã tải
|
50 |
+
@spaces.GPU
|
51 |
+
def get_model():
|
52 |
+
global generator, model_loaded
|
53 |
+
if not model_loaded:
|
54 |
+
return initialize_model()
|
55 |
+
return generator
|
56 |
+
|
57 |
# Hàm chuyển đổi âm thanh thành tensor
|
58 |
def audio_to_tensor(audio_path: str) -> Tuple[torch.Tensor, int]:
|
59 |
waveform, sample_rate = torchaudio.load(audio_path)
|
|
|
83 |
top_k: int = 50,
|
84 |
progress=gr.Progress()
|
85 |
) -> str:
|
86 |
+
# Lấy mô hình đã tải
|
87 |
+
generator = get_model()
|
88 |
|
89 |
# Chuẩn bị ngữ cảnh (context)
|
90 |
context = []
|
|
|
134 |
top_k: int = 50,
|
135 |
progress=gr.Progress()
|
136 |
) -> str:
|
137 |
+
# Lấy mô hình đã tải
|
138 |
+
generator = get_model()
|
139 |
|
140 |
progress(0.3, "Đang tạo âm thanh...")
|
141 |
# Tạo âm thanh từ văn bản
|
|
|
297 |
ZeroGPU giúp giải phóng bộ nhớ GPU khi không sử dụng, giúp tiết kiệm tài nguyên và cải thiện hiệu suất.
|
298 |
|
299 |
Khi bạn tạo âm thanh, GPU sẽ được sử dụng tự động và giải phóng sau khi hoàn thành.
|
300 |
+
|
301 |
+
Lưu ý: Trong môi trường ZeroGPU, CUDA không được khởi tạo trong quá trình chính, mà chỉ trong các hàm có decorator @spaces.GPU.
|
302 |
""")
|
303 |
|
304 |
+
@spaces.GPU
|
305 |
def check_gpu():
|
306 |
if torch.cuda.is_available():
|
307 |
gpu_name = torch.cuda.get_device_name(0)
|
|
|
314 |
gpu_info = gr.Textbox(label="Thông tin GPU", interactive=False)
|
315 |
|
316 |
check_gpu_btn.click(fn=check_gpu, inputs=None, outputs=gpu_info)
|
317 |
+
|
318 |
+
# Thêm nút tải mô hình
|
319 |
+
load_model_btn = gr.Button("Tải mô hình")
|
320 |
+
model_status = gr.Textbox(label="Trạng thái mô hình", interactive=False)
|
321 |
+
|
322 |
+
@spaces.GPU
|
323 |
+
def load_model_and_report():
|
324 |
+
global model_loaded
|
325 |
+
if model_loaded:
|
326 |
+
return "Mô hình đã được tải trước đó!"
|
327 |
+
else:
|
328 |
+
initialize_model()
|
329 |
+
return "Mô hình đã được tải thành công!"
|
330 |
+
|
331 |
+
load_model_btn.click(fn=load_model_and_report, inputs=None, outputs=model_status)
|
332 |
|
333 |
# Kết nối các thành phần
|
334 |
generate_btn.click(
|
|
|
360 |
],
|
361 |
outputs=output_audio_context
|
362 |
)
|
|
|
|
|
|
|
363 |
|
364 |
return demo
|
365 |
|
generator.py
CHANGED
@@ -10,6 +10,8 @@ from tokenizers.processors import TemplateProcessing
|
|
10 |
from transformers import AutoTokenizer
|
11 |
from watermarking import CSM_1B_GH_WATERMARK, load_watermarker, watermark
|
12 |
|
|
|
|
|
13 |
|
14 |
@dataclass
|
15 |
class Segment:
|
@@ -174,8 +176,14 @@ def load_csm_1b(device: str = "cuda") -> Generator:
|
|
174 |
Generator: Đối tượng Generator để tạo âm thanh từ văn bản
|
175 |
"""
|
176 |
try:
|
177 |
-
|
178 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
179 |
|
180 |
generator = Generator(model)
|
181 |
return generator
|
|
|
10 |
from transformers import AutoTokenizer
|
11 |
from watermarking import CSM_1B_GH_WATERMARK, load_watermarker, watermark
|
12 |
|
13 |
+
# Tắt tính năng compile của torch để tránh lỗi triton
|
14 |
+
torch._dynamo.config.suppress_errors = True
|
15 |
|
16 |
@dataclass
|
17 |
class Segment:
|
|
|
176 |
Generator: Đối tượng Generator để tạo âm thanh từ văn bản
|
177 |
"""
|
178 |
try:
|
179 |
+
# Trong ZeroGPU, không nên khởi tạo CUDA trong quá trình chính
|
180 |
+
# Chỉ chuyển mô hình sang GPU khi được gọi trong hàm có decorator @spaces.GPU
|
181 |
+
if 'cuda' in device and not torch.cuda.is_initialized():
|
182 |
+
# Sử dụng CPU cho quá trình chính
|
183 |
+
model = Model.from_pretrained("sesame/csm-1b")
|
184 |
+
else:
|
185 |
+
model = Model.from_pretrained("sesame/csm-1b")
|
186 |
+
model.to(device=device, dtype=torch.bfloat16)
|
187 |
|
188 |
generator = Generator(model)
|
189 |
return generator
|