CLOUDYUL commited on
Commit
f4d60e7
Β·
0 Parent(s):

Remove nested .git from detector folder

Browse files
Files changed (6) hide show
  1. .gitattributes +3 -0
  2. .gitignore +3 -0
  3. Dockerfile +23 -0
  4. detector +1 -0
  5. requirements.txt +4 -0
  6. server.py +76 -0
.gitattributes ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ detector/*.safetensors filter=lfs diff=lfs merge=lfs -text
2
+ detector/*.bin filter=lfs diff=lfs merge=lfs -text
3
+ detector/*.json filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ __pycache__/
2
+ *.pyc
3
+ .env
Dockerfile ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Dockerfile
2
+
3
+ # 1) Python 3.10 slim 베이슀 이미지 μ‚¬μš©
4
+ FROM python:3.10-slim
5
+
6
+ # 2) μž‘μ—… 디렉터리λ₯Ό /app으둜 μ§€μ •
7
+ WORKDIR /app
8
+
9
+ # 3) (선택) μ‹œμŠ€ν…œ 쒅속 νŒ¨ν‚€μ§€ μ„€μΉ˜ β†’ λͺ¨λΈ 컴파일 μ‹œ ν•„μš”ν•˜λ‹€λ©΄ μΆ”κ°€
10
+ RUN apt-get update && apt-get install -y \
11
+ build-essential \
12
+ && rm -rf /var/lib/apt/lists/*
13
+
14
+ # 4) requirements.txt 볡사 ν›„ pip으둜 쒅속성 μ„€μΉ˜
15
+ COPY requirements.txt .
16
+ RUN pip install --upgrade pip \
17
+ && pip install --no-cache-dir -r requirements.txt
18
+
19
+ # 5) λ‚˜λ¨Έμ§€ λͺ¨λ“  파일(μ½”λ“œ + detector 폴더) 볡사
20
+ COPY . .
21
+
22
+ # 6) μ»¨ν…Œμ΄λ„ˆ ꡬ동 μ‹œ uvicorn으둜 FastAPI μ„œλ²„ μ‹€ν–‰ (포트 7860)
23
+ CMD ["uvicorn", "server:app", "--host", "0.0.0.0", "--port", "7860"]
detector ADDED
@@ -0,0 +1 @@
 
 
1
+ Subproject commit 6f96793357b0992617416e965fa0721310ee1e19
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ fastapi
2
+ uvicorn[standard]
3
+ torch
4
+ transformers
server.py ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # server.py
2
+
3
+ from typing import List
4
+ from fastapi import FastAPI, HTTPException
5
+ from pydantic import BaseModel
6
+ import torch
7
+ from transformers import AutoTokenizer, AutoModelForSequenceClassification
8
+
9
+ # ── 1) FastAPI μ•± 생성
10
+ app = FastAPI(
11
+ title="AGaRiCleaner Toxicity Detector (FastAPI)",
12
+ description="FastAPI 기반 ν•œκ΅­μ–΄ μ•…ν”Œ 탐지 λͺ¨λΈ μ„œλ²„",
13
+ version="1.0.0"
14
+ )
15
+
16
+ # ── 2) μš”μ²­ μŠ€ν‚€λ§ˆ μ •μ˜ (Pydantic λͺ¨λΈ)
17
+ class TextsIn(BaseModel):
18
+ data: List[str] # JSON μ˜ˆμ‹œ: { "data": ["λ¬Έμž₯1", "λ¬Έμž₯2", ...] }
19
+
20
+ # ── 3) λͺ¨λΈ 디렉터리 경둜 (Spaceμ—μ„œλŠ” /app/detector 폴더가 λœλ‹€)
21
+ MODEL_DIR = "./detector"
22
+
23
+ # ── 4) λ””λ°”μ΄μŠ€ μ„€μ • (Mac MPS 지원 μ—¬λΆ€ 확인)
24
+ device = "mps" if torch.backends.mps.is_available() else "cpu"
25
+ print(f"β–Ά λͺ¨λΈ μΆ”λ‘  λ””λ°”μ΄μŠ€: {device}")
26
+
27
+ # ── 5) ν† ν¬λ‚˜μ΄μ €μ™€ λͺ¨λΈ λ‘œλ“œ
28
+ try:
29
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_DIR)
30
+ model = AutoModelForSequenceClassification.from_pretrained(MODEL_DIR)
31
+ model.to(device)
32
+ model.eval()
33
+ print("βœ” λͺ¨λΈ 및 ν† ν¬λ‚˜μ΄μ € λ‘œλ“œ μ™„λ£Œ")
34
+ except Exception as e:
35
+ print("βœ– λͺ¨λΈ λ‘œλ“œ μ‹€νŒ¨:", e)
36
+ raise e
37
+
38
+ # ── 6) μ•…ν”Œ 탐지 ν•¨μˆ˜ μ •μ˜
39
+ def detect_toxic(texts: List[str]) -> List[dict]:
40
+ encoding = tokenizer(
41
+ texts,
42
+ padding=True,
43
+ truncation=True,
44
+ return_tensors="pt",
45
+ max_length=128
46
+ )
47
+ input_ids = encoding["input_ids"].to(device)
48
+ attention_mask = encoding["attention_mask"].to(device)
49
+
50
+ with torch.no_grad():
51
+ outputs = model(input_ids=input_ids, attention_mask=attention_mask)
52
+ logits = outputs.logits
53
+ probs = torch.softmax(logits, dim=-1).cpu().tolist()
54
+
55
+ results = []
56
+ for i, text in enumerate(texts):
57
+ score_1 = probs[i][1]
58
+ label = 1 if score_1 >= 0.5 else 0
59
+ results.append({
60
+ "text": text,
61
+ "label": label,
62
+ "score": round(score_1, 6)
63
+ })
64
+ return results
65
+
66
+ # ── 7) POST /predict μ—”λ“œν¬μΈνŠΈ μ •μ˜
67
+ @app.post("/predict", summary="ν…μŠ€νŠΈ λͺ©λ‘μ„ μž…λ ₯λ°›μ•„ μ•…ν”Œ μ—¬λΆ€(label, score) λ°˜ν™˜")
68
+ async def predict_endpoint(payload: TextsIn):
69
+ texts = payload.data
70
+ if not isinstance(texts, list) or len(texts) == 0:
71
+ raise HTTPException(status_code=400, detail="β€˜data’ ν•„λ“œμ— μ΅œμ†Œ 1개 μ΄μƒμ˜ λ¬Έμžμ—΄μ΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.")
72
+ try:
73
+ output = detect_toxic(texts)
74
+ return output
75
+ except Exception as e:
76
+ raise HTTPException(status_code=500, detail=f"λͺ¨λΈ μΆ”λ‘  쀑 였λ₯˜ λ°œμƒ: {e}")