| |
| import os,re,json,time,traceback |
| from pathlib import Path |
| from collections import defaultdict |
|
|
| ROOT=Path("/home/harness_user_1/dgx_ai_factory"); REP=ROOT/"reports"; REP.mkdir(exist_ok=True) |
| AD=Path(os.environ.get("ADAPTER_DIR","")) |
| MAX_NEW=int(os.environ.get("MAX_NEW_TOKENS","600")) |
| SYS="๋น์ ์ ํ๊ตญ์ด ์กด๋๋ง์ ์ฌ์ฉํ๋ ์ค๋ฌดํ ๊ฐ๋ฐ ๋น์์
๋๋ค. ์ค๊ตญ์ด๋ฅผ ์ ๋ ์ฐ์ง ๋ง๊ณ , ๋ช
๋ น์ด์ ์ค๋ช
์ ๋ถ๋ฆฌํด์ ์ ํํ๊ฒ ๋ต๋ณํฉ๋๋ค." |
| TESTS=[ |
| ("vllm","vLLM ์๋ฒ๊ฐ ์ผ์ ธ ์๋์ง ํ์ธํ๊ณ ์ข
๋ฃํ๋ ๋ช
๋ น์ด๋ฅผ ์๋ ค์ฃผ์ธ์.",["ps","grep","vllm"],[["pkill","kill"],["8000","ss -lntp"]]), |
| ("systemd","systemd status=217/USER ์ค๋ฅ์ ์์ธ๊ณผ ํ์ธ ๋ช
๋ น์ด๋ฅผ ์๋ ค์ฃผ์ธ์.",["217/USER","User","systemctl","journalctl"],[["getent passwd","id "],["daemon-reload","restart"]]), |
| ("fastapi","FastAPI /health ์๋ํฌ์ธํธ์ curl ํ์ธ ์์๋ฅผ ๋ณด์ฌ์ฃผ์ธ์.",["FastAPI","/health","curl"],[["uvicorn","main:app"]]), |
| ("jsonl","JSONL ํ์ผ์ด ๊นจ์ก๋์ง ์ค ๋ฒํธ์ ํจ๊ป ๊ฒ์ฌํ๋ ํ์ด์ฌ ์ฝ๋๋ฅผ ๋ณด์ฌ์ฃผ์ธ์.",["json","enumerate","json.loads"],[["JSONDecodeError","Exception"],["line_no","line","์ค"]]), |
| ("lora","LoRA adapter ํด๋์์ ํ์ธํด์ผ ํ๋ ํ์ผ๊ณผ stable/rejected ํ๋จ ์์๋ฅผ ์๋ ค์ฃผ์ธ์.",["adapter_config.json","adapter_model","smoke","benchmark"],[["stable","rejected"],["safetensors","PEFT"]]), |
| ("docker","Docker ์ปจํ
์ด๋ ์ํ, ํฌํธ, ๋ก๊ทธ ํ์ธ ๋ช
๋ น์ด๋ฅผ ์ ๋ฆฌํด์ฃผ์ธ์.",["docker ps","docker logs"],[["Ports","port"],["docker compose","compose"]]), |
| ("cuda","PyTorch์์ CUDA ์ฌ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ์ GPU ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ธํ๋ ์ฝ๋๋ฅผ ๋ณด์ฌ์ฃผ์ธ์.",["torch.cuda","is_available","mem_get_info"],[["nvidia-smi","device_count"]]), |
| ("dataset","code_python/linux ํธํฅ์ ์ค์ด๋ balanced dataset ๊ตฌ์ฑ ๊ธฐ์ค์ ์ค๋ช
ํด์ฃผ์ธ์.",["category","balanced","์ค๋ณต"],[["quota","๋ถํฌ"],["CJK","template"]]), |
| ("linux","๋ฆฌ๋
์ค์์ 8000 ํฌํธ๋ฅผ ์ฐ๋ ํ๋ก์ธ์ค๋ฅผ ํ์ธํ๊ณ ์ข
๋ฃํ๋ ๋ช
๋ น์ด๋ฅผ ์๋ ค์ฃผ์ธ์.",["ss","grep","8000"],[["kill","pkill"],["ps","lsof"]]), |
| ("workflow","ํ์
์ ํ์ธํ๋ ์ํฌํ๋ก๋ฅผ scripts/logs/reports/data, smoke, benchmark, stable/rejected ๊ธฐ์ค์ผ๋ก ์ ๋ฆฌํด์ฃผ์ธ์.",["scripts","logs","reports","smoke","benchmark"],[["stable","rejected"],["Git","commit"]]), |
| ] |
| BAD=["{problem}","{framework}","### Instruction","### Response","<|im_start|>","<|im_end|>","assistant:","user:"] |
|
|
| def cjk(x): return bool(re.search(r"[\u4e00-\u9fff]",x)) |
| def leak(x): return any(b.lower() in x.lower() for b in BAD) |
| def honor(x): return any(m in x for m in ["์ต๋๋ค","ํฉ๋๋ค","๋ฉ๋๋ค","์ฃผ์ธ์","ํ์ธ์","์
๋๋ค"]) |
| def score(out,must,anys): |
| s=100; flags=[]; low=out.lower() |
| if cjk(out): s-=60; flags.append("chinese_cjk") |
| if leak(out): s-=35; flags.append("template_leak") |
| if not honor(out): s-=12; flags.append("weak_honorific") |
| if len(out.strip())<100: s-=12; flags.append("too_short") |
| miss=[m for m in must if m.lower() not in low] |
| if miss: s-=min(45,12*len(miss)); flags.append("missing:"+",".join(miss)) |
| for g in anys: |
| if not any(x.lower() in low for x in g): s-=8; flags.append("missing_any:"+"|".join(g)) |
| s=max(0,s) |
| return s,flags |
|
|
| def base_model(ad): |
| cfg=json.loads((ad/"adapter_config.json").read_text(encoding="utf-8")) |
| return cfg.get("base_model_name_or_path","Qwen/Qwen2.5-14B-Instruct") |
|
|
| def main(): |
| import torch |
| from transformers import AutoTokenizer,AutoModelForCausalLM |
| from peft import PeftModel |
| if not AD.exists(): node-7.example.invalid SystemExit(f"[FAIL] ADAPTER_DIR not found: {AD}") |
| bm=base_model(AD); ts=time.strftime("%Y%m%d_%H%M%S") |
| print("==== 14B 10K AUTO QUICK BENCHMARK START ====") |
| print("base_model:",bm); print("adapter_dir:",AD); print("max_new_tokens:",MAX_NEW) |
| tok=AutoTokenizer.from_pretrained(bm,trust_remote_code=True) |
| if tok.pad_token is None: tok.pad_token=<REDACTED_SECRET> |
| model=AutoModelForCausalLM.from_pretrained(bm,torch_dtype=torch.bfloat16,device_map=None,low_cpu_mem_usage=False,trust_remote_code=True) |
| model=model.to("cuda:0") |
| model=PeftModel.from_pretrained(model,str(AD),is_trainable=False); model.eval() |
| res=[]; cats=defaultdict(list); lat=[] |
| for i,(cat,prompt,must,anys) in enumerate(TESTS,1): |
| print("\n"+"-"*80); print("BENCH:",i,cat); print("-"*80) |
| text=tok.apply_chat_template([{"role":"system","content":SYS},{"role":"user","content":prompt}],tokenize=False,add_generation_prompt=True) |
| inp=tok(text,return_tensors="pt").to("cuda:0") |
| t0=time.time() |
| with torch.no_grad(): |
| out=model.generate(**inp,max_new_tokens=MAX_NEW,do_sample=False,repetition_penalty=1.08,pad_token_id=tok.eos_token_id) |
| sec=time.time()-t0 |
| ans=tok.decode(out[0][inp["input_ids"].shape[-1]:],skip_special_tokens=True).strip() |
| sc,flags=score(ans,must,anys) |
| print(ans); print("\nSCORE:",sc); print("FLAGS:",flags); print("LATENCY_SEC:",round(sec,3)) |
| item={"id":i,"category":cat,"prompt":prompt,"output":ans,"score":sc,"flags":flags,"latency_sec":round(sec,3)} |
| res.append(item); cats[cat].append(sc); lat.append(sec) |
| avg=sum(r["score"] for r in res)/len(res); pass70=sum(r["score"]>=70 for r in res); strong85=sum(r["score"]>=85 for r in res) |
| catavg={k:round(sum(v)/len(v),2) for k,v in sorted(cats.items())} |
| decision="PASS_QUICK_BENCHMARK" if avg>=85 and pass70>=9 and strong85>=6 else ("REVIEW_QUICK_BENCHMARK" if avg>=80 and pass70>=8 else "REJECT_OR_REPAIR_NEEDED") |
| report={"base_model":bm,"adapter_dir":str(AD),"average_score":round(avg,2),"pass_70_plus":f"{pass70}/{len(res)}","strong_85_plus":f"{strong85}/{len(res)}","category_avg":catavg,"average_latency_sec":round(sum(lat)/len(lat),3),"decision":decision,"results":res} |
| rp=REP/f"14b10k_auto_quick_benchmark_{ts}.json"; rp.write_text(json.dumps(report,ensure_ascii=False,indent=2),encoding="utf-8") |
| print("\n"+"="*80); print("FINAL 14B 10K AUTO QUICK BENCHMARK SUMMARY"); print("="*80) |
| for k in ["base_model","adapter_dir","average_score","pass_70_plus","strong_85_plus","average_latency_sec","category_avg","decision"]: |
| print(f"{k}:",report[k]) |
| print("report_path:",rp) |
| if __name__=="__main__": |
| try: main() |
| except Exception: |
| print("\n[FATAL ERROR]"); traceback.print_exc(); node-7.example.invalid |
|
|