Deep-sea commited on
Commit
1ff82b3
·
verified ·
1 Parent(s): 16b49fc

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +63 -16
Dockerfile CHANGED
@@ -140,7 +140,7 @@ from pathlib import Path
140
  from watchdog.observers import Observer
141
  from watchdog.events import FileSystemEventHandler
142
  from huggingface_hub import HfApi
143
- # 删除:from huggingface_hub.utils import tqdm_utils
144
  import base64
145
  from datetime import datetime
146
  import pytz
@@ -178,54 +178,95 @@ class DataDirectoryHandler(FileSystemEventHandler):
178
  self.data_directory = data_directory
179
  self.api = HfApi(token=hf_token)
180
  self.last_commit_time = 0
181
- self.commit_delay = 1
182
- self.pending_changes = []
183
  logger.info(f"初始化监控器,监控目录: {data_directory},目标仓库: {repo_id}")
184
 
185
  def on_any_event(self, event):
 
186
  if event.is_directory:
187
  return
188
  self.pending_changes.append((event.event_type, event.src_path))
189
  self.schedule_commit(f"文件{event.event_type}")
190
 
191
  def schedule_commit(self, change_type):
 
192
  current_time = time.time()
193
  if current_time - self.last_commit_time > self.commit_delay:
194
  self.last_commit_time = current_time
195
  asyncio.run(self.commit_changes(change_type))
196
 
197
  async def commit_changes(self, change_type):
 
198
  max_retries = 3
199
  retry_delay = 5
200
  change_summary = f"{change_type} ({len(self.pending_changes)} 文件)"
201
- self.pending_changes = []
 
202
  for attempt in range(max_retries):
203
  try:
204
  commit_message = f"自动提交: {change_summary} - {time.strftime('%Y-%m-%d %H:%M:%S')}"
205
  logger.info(f"开始上传: {commit_message}")
206
- await asyncio.to_thread(
207
- self.api.upload_folder,
208
- folder_path=self.data_directory,
209
- repo_id=self.repo_id,
210
- repo_type="dataset",
211
- commit_message=commit_message,
212
- ignore_patterns=["*.tmp", "*.log", "*.temp", ".git/*"],
213
- disable_progress_bar=True # 正确禁用进度条
214
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
215
  logger.info(f"成功提交变更到 Hugging Face Hub: {commit_message}")
216
  return
 
217
  except Exception as e:
218
  logger.error(f"提交失败 (尝试 {attempt + 1}/{max_retries}): {e}")
219
  if attempt < max_retries - 1:
220
  logger.info(f"将在 {retry_delay} 秒后重试...")
221
  await asyncio.sleep(retry_delay)
 
222
  logger.error(f"达到最大重试次数,上传失败")
223
 
224
  def start_directory_monitoring(data_directory="/data", repo_id=None, hf_token=None):
 
225
  if not hf_token:
226
  hf_token_encoded = "aGZfcXllTEJnUUtPb2FUbHBMZ0FuTGFGTmJPV2xjUUtJT0VycQ=="
227
  hf_token = base64.b64decode(hf_token_encoded).decode('utf-8')
228
- logger.info(f"HF_TOKEN value: {hf_token}")
229
 
230
  if not repo_id:
231
  raise ValueError("必须提供 repo_id 参数")
@@ -248,6 +289,7 @@ def start_directory_monitoring(data_directory="/data", repo_id=None, hf_token=No
248
  return observer
249
 
250
  def start_gitea_server(port=7860):
 
251
  def run_gitea():
252
  try:
253
  gitea_process = subprocess.Popen(
@@ -286,6 +328,7 @@ def start_gitea_server(port=7860):
286
  return gitea_thread
287
 
288
  async def main():
 
289
  CONFIG = {
290
  "data_directory": "/data",
291
  "repo_id": os.getenv("REPO_ID", "02engine/02gitea"),
@@ -300,13 +343,17 @@ async def main():
300
  try:
301
  logger.info(f"启动集成服务 (尝试 {retry_count + 1}/{max_retries})...")
302
 
 
303
  logger.info("运行 pullhf.py 拉取最新数据集")
304
  pull_result = subprocess.run(["python3", "/pullhf.py"], check=True)
305
  if pull_result.returncode != 0:
306
  logger.error("pullhf.py 执行失败,退出")
307
  exit(1)
308
 
 
309
  gitea_thread = start_gitea_server(CONFIG["gitea_port"])
 
 
310
  observer = start_directory_monitoring(
311
  data_directory=CONFIG["data_directory"],
312
  repo_id=CONFIG["repo_id"],
@@ -314,8 +361,8 @@ async def main():
314
  )
315
 
316
  logger.info("所有服务已启动完成!")
317
- logger.info("目录监控: /data to Hugging Face Hub")
318
- logger.info("Gitea 服务: http://localhost:7860")
319
  logger.info("按 Ctrl+C 停止所有服务")
320
 
321
  try:
 
140
  from watchdog.observers import Observer
141
  from watchdog.events import FileSystemEventHandler
142
  from huggingface_hub import HfApi
143
+ import huggingface_hub
144
  import base64
145
  from datetime import datetime
146
  import pytz
 
178
  self.data_directory = data_directory
179
  self.api = HfApi(token=hf_token)
180
  self.last_commit_time = 0
181
+ self.commit_delay = 1 # 防抖延迟 1 秒
182
+ self.pending_changes = [] # 缓冲待上传变更
183
  logger.info(f"初始化监控器,监控目录: {data_directory},目标仓库: {repo_id}")
184
 
185
  def on_any_event(self, event):
186
+ """捕获所有文件系统事件"""
187
  if event.is_directory:
188
  return
189
  self.pending_changes.append((event.event_type, event.src_path))
190
  self.schedule_commit(f"文件{event.event_type}")
191
 
192
  def schedule_commit(self, change_type):
193
+ """安排提交任务,带有防抖机制"""
194
  current_time = time.time()
195
  if current_time - self.last_commit_time > self.commit_delay:
196
  self.last_commit_time = current_time
197
  asyncio.run(self.commit_changes(change_type))
198
 
199
  async def commit_changes(self, change_type):
200
+ """异步提交变更到 Hugging Face Hub,带重试机制 + 版本兼容禁用进度条"""
201
  max_retries = 3
202
  retry_delay = 5
203
  change_summary = f"{change_type} ({len(self.pending_changes)} 文件)"
204
+ self.pending_changes = [] # 清空缓冲区
205
+
206
  for attempt in range(max_retries):
207
  try:
208
  commit_message = f"自动提交: {change_summary} - {time.strftime('%Y-%m-%d %H:%M:%S')}"
209
  logger.info(f"开始上传: {commit_message}")
210
+
211
+ # 基础参数
212
+ upload_kwargs = {
213
+ "folder_path": self.data_directory,
214
+ "repo_id": self.repo_id,
215
+ "repo_type": "dataset",
216
+ "commit_message": commit_message,
217
+ "ignore_patterns": ["*.tmp", "*.log", "*.temp", ".git/*"]
218
+ }
219
+
220
+ # === 版本兼容:自动选择禁用进度条的方式 ===
221
+ try:
222
+ version_str = huggingface_hub.__version__
223
+ version = tuple(map(int, (version_str.split('.') + ['0', '0', '0'])[:3]))
224
+ logger.info(f"检测到 huggingface_hub 版本: {version_str}")
225
+
226
+ if version >= (0, 25, 0):
227
+ # 新版本:使用 disable_progress_bar
228
+ upload_kwargs["disable_progress_bar"] = True
229
+ logger.info("使用 disable_progress_bar=True 禁用进度条")
230
+
231
+ elif version >= (0, 23, 0):
232
+ # 旧版本:尝试使用 tqdm_class
233
+ try:
234
+ from huggingface_hub.utils import tqdm_utils
235
+ upload_kwargs["tqdm_class"] = tqdm_utils.DisableTqdm
236
+ logger.info("使用 tqdm_class=DisableTqdm 禁用进度条")
237
+ except ImportError:
238
+ logger.warning("无法导入 tqdm_utils,进度条可能仍会显示(旧版兼容性问题)")
239
+
240
+ else:
241
+ logger.warning(f"非常旧的 huggingface_hub 版本 {version_str},无法禁用进度条")
242
+
243
+ except Exception as e:
244
+ logger.warning(f"版本检测失败,尝试旧方式禁用进度条: {e}")
245
+ try:
246
+ from huggingface_hub.utils import tqdm_utils
247
+ upload_kwargs["tqdm_class"] = tqdm_utils.DisableTqdm
248
+ except:
249
+ pass
250
+
251
+ # 执行上传
252
+ await asyncio.to_thread(self.api.upload_folder, **upload_kwargs)
253
  logger.info(f"成功提交变更到 Hugging Face Hub: {commit_message}")
254
  return
255
+
256
  except Exception as e:
257
  logger.error(f"提交失败 (尝试 {attempt + 1}/{max_retries}): {e}")
258
  if attempt < max_retries - 1:
259
  logger.info(f"将在 {retry_delay} 秒后重试...")
260
  await asyncio.sleep(retry_delay)
261
+
262
  logger.error(f"达到最大重试次数,上传失败")
263
 
264
  def start_directory_monitoring(data_directory="/data", repo_id=None, hf_token=None):
265
+ """启动目录监控服务"""
266
  if not hf_token:
267
  hf_token_encoded = "aGZfcXllTEJnUUtPb2FUbHBMZ0FuTGFGTmJPV2xjUUtJT0VycQ=="
268
  hf_token = base64.b64decode(hf_token_encoded).decode('utf-8')
269
+ logger.info(f"HF_TOKEN 已解码(长度: {len(hf_token)}")
270
 
271
  if not repo_id:
272
  raise ValueError("必须提供 repo_id 参数")
 
289
  return observer
290
 
291
  def start_gitea_server(port=7860):
292
+ """启动 Gitea 服务器"""
293
  def run_gitea():
294
  try:
295
  gitea_process = subprocess.Popen(
 
328
  return gitea_thread
329
 
330
  async def main():
331
+ """主函数 - 启动 Gitea 和目录监控服务,带崩溃重启功能"""
332
  CONFIG = {
333
  "data_directory": "/data",
334
  "repo_id": os.getenv("REPO_ID", "02engine/02gitea"),
 
343
  try:
344
  logger.info(f"启动集成服务 (尝试 {retry_count + 1}/{max_retries})...")
345
 
346
+ # 先运行 pullhf.py 拉取最新数据集
347
  logger.info("运行 pullhf.py 拉取最新数据集")
348
  pull_result = subprocess.run(["python3", "/pullhf.py"], check=True)
349
  if pull_result.returncode != 0:
350
  logger.error("pullhf.py 执行失败,退出")
351
  exit(1)
352
 
353
+ # 启动 Gitea 服务器
354
  gitea_thread = start_gitea_server(CONFIG["gitea_port"])
355
+
356
+ # 启动目录监控服务
357
  observer = start_directory_monitoring(
358
  data_directory=CONFIG["data_directory"],
359
  repo_id=CONFIG["repo_id"],
 
361
  )
362
 
363
  logger.info("所有服务已启动完成!")
364
+ logger.info("目录监控: /data Hugging Face Hub")
365
+ logger.info("Gitea 服务: http://${HF_SPACE_URL:-localhost}:7860")
366
  logger.info("按 Ctrl+C 停止所有服务")
367
 
368
  try: