Spaces:
Sleeping
Sleeping
File size: 5,849 Bytes
a005c19 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
from typing import Dict, Tuple
import logging
import gspread
from sheet_manager.sheet_crud.sheet_crud import SheetManager
class SheetChecker:
def __init__(self, sheet_manager: SheetManager):
"""SheetChecker 초기화"""
self.sheet_manager = sheet_manager
self.bench_sheet_manager = None
self.logger = logging.getLogger(__name__)
self._init_bench_sheet()
def _init_bench_sheet(self):
"""model 시트용 시트 매니저 초기화"""
self.bench_sheet_manager = type(self.sheet_manager)(
spreadsheet_url=self.sheet_manager.spreadsheet_url,
worksheet_name="model",
column_name="Model name"
)
def add_benchmark_column(self, column_name: str):
"""새로운 벤치마크 컬럼 추가"""
try:
headers = self.bench_sheet_manager.get_available_columns()
if column_name in headers:
return
new_col_index = len(headers) + 1
cell = gspread.utils.rowcol_to_a1(1, new_col_index)
self.bench_sheet_manager.sheet.update(cell, [[column_name]])
# 관련 컬럼 추가 (벤치마크이름*100)
next_col_index = new_col_index + 1
next_cell = gspread.utils.rowcol_to_a1(1, next_col_index)
self.bench_sheet_manager.sheet.update(next_cell, [[f"{column_name}*100"]])
self.logger.info(f"새로운 벤치마크 컬럼들 추가됨: {column_name}, {column_name}*100")
# 컬럼 추가 후 시트 매니저 재연결
self.bench_sheet_manager._connect_to_sheet(validate_column=False)
except Exception as e:
self.logger.error(f"벤치마크 컬럼 {column_name} 추가 중 오류 발생: {str(e)}")
raise
def check_model_and_benchmark(self, model_name: str, benchmark_name: str) -> Tuple[bool, bool]:
"""
모델 존재 여부와 벤치마크 상태를 확인하고, 필요한 경우 모델 정보를 추가
Args:
model_name: 확인할 모델 이름
benchmark_name: 확인할 벤치마크 이름
Returns:
Tuple[bool, bool]: (모델이 새로 추가되었는지 여부, 벤치마크가 이미 존재하는지 여부)
"""
try:
# 모델 존재 여부 확인
model_exists = self._check_model_exists(model_name)
model_added = False
# 모델이 없으면 추가
if not model_exists:
self._add_new_model(model_name)
model_added = True
self.logger.info(f"새로운 모델 추가됨: {model_name}")
# 벤치마크 컬럼이 없으면 추가
available_columns = self.bench_sheet_manager.get_available_columns()
if benchmark_name not in available_columns:
self.add_benchmark_column(benchmark_name)
self.logger.info(f"새로운 벤치마크 컬럼 추가됨: {benchmark_name}")
# 벤치마크 상태 확인
benchmark_exists = self._check_benchmark_exists(model_name, benchmark_name)
return model_added, benchmark_exists
except Exception as e:
self.logger.error(f"모델/벤치마크 확인 중 오류 발생: {str(e)}")
raise
def _check_model_exists(self, model_name: str) -> bool:
"""모델 존재 여부 확인"""
try:
self.bench_sheet_manager.change_column("Model name")
values = self.bench_sheet_manager.get_all_values()
return model_name in values
except Exception as e:
self.logger.error(f"모델 존재 여부 확인 중 오류 발생: {str(e)}")
raise
def _add_new_model(self, model_name: str):
"""새로운 모델 정보 추가"""
try:
model_info = {
"Model name": model_name,
"Model link": f"https://huggingface.co/PIA-SPACE-LAB/{model_name}",
"Model": f'<a target="_blank" href="https://huggingface.co/PIA-SPACE-LAB/{model_name}" style="color: var(--link-text-color); text-decoration: underline;text-decoration-style: dotted;">{model_name}</a>'
}
for column_name, value in model_info.items():
self.bench_sheet_manager.change_column(column_name)
self.bench_sheet_manager.push(value)
except Exception as e:
self.logger.error(f"모델 정보 추가 중 오류 발생: {str(e)}")
raise
def _check_benchmark_exists(self, model_name: str, benchmark_name: str) -> bool:
"""벤치마크 값 존재 여부 확인"""
try:
# 해당 모델의 벤치마크 값 확인
self.bench_sheet_manager.change_column("Model name")
all_values = self.bench_sheet_manager.get_all_values()
row_index = all_values.index(model_name) + 2
self.bench_sheet_manager.change_column(benchmark_name)
value = self.bench_sheet_manager.sheet.cell(row_index, self.bench_sheet_manager.col_index).value
return bool(value and value.strip())
except Exception as e:
self.logger.error(f"벤치마크 존재 여부 확인 중 오류 발생: {str(e)}")
raise
# 사용 예시
if __name__ == "__main__":
sheet_manager = SheetManager()
checker = SheetChecker(sheet_manager)
model_added, benchmark_exists = checker.check_model_and_benchmark(
model_name="test-model",
benchmark_name="COCO"
)
print(f"Model added: {model_added}")
print(f"Benchmark exists: {benchmark_exists}") |