'프로그램 사용 > openSCAD' 카테고리의 다른 글
| openSCAD MCP (0) | 2026.06.20 |
|---|---|
| pythonSCAD (0) | 2026.06.20 |
| openSCAD 설치 (0) | 2026.06.20 |
| openscad (0) | 2026.05.27 |
| openSCAD MCP (0) | 2026.06.20 |
|---|---|
| pythonSCAD (0) | 2026.06.20 |
| openSCAD 설치 (0) | 2026.06.20 |
| openscad (0) | 2026.05.27 |

[링크 : https://openscad.org/]
| // logo.scad - Basic example of module, top-level variable and $fn usage Logo(50); // The $fn parameter will influence all objects inside this module // It can, optionally, be overridden when instantiating the module module Logo(size=50, $fn=100) { // Temporary variables hole = size/2; cylinderHeight = size * 1.25; // One positive object (sphere) and three negative objects (cylinders) difference() { sphere(d=size); cylinder(d=hole, h=cylinderHeight, center=true); // The '#' operator highlights the object #rotate([90, 0, 0]) cylinder(d=hole, h=cylinderHeight, center=true); rotate([0, 90, 0]) cylinder(d=hole, h=cylinderHeight, center=true); } } echo(version=version()); // Written by Clifford Wolf <clifford@clifford.at> and Marius // Kintel <marius@kintel.net> // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see <http://creativecommons.org/publicdomain/zero/1.0/>. |
주석 처리는 모르겠고 딱 봐서 sphere만 있으면 구를 그릴것 같아서 해보니 ok
오호.. 이래서 LLM 연동해서 그리기 쉽다고 하는 거였나?
| Logo(50); module Logo(size=50, $fn=100) { hole = size/2; cylinderHeight = size * 1.25; difference() { sphere(d=size); } } ![]() |
| openSCAD MCP (0) | 2026.06.20 |
|---|---|
| pythonSCAD (0) | 2026.06.20 |
| openSCAD cheatsheet (0) | 2026.06.20 |
| openscad (0) | 2026.05.27 |
최초 커밋으로 내려가니 그래도 조금만 손대서 돌아간다. 휴
| $git checkout cfef9771 $ python main_stfpm.py --train --eval --model_name mobilenet_v2 --categories bottle --ad_layers 3 4 5 --boot_layer 2 --results_dirpath debug_outputs/metrics --checkpoint_dir debug_outputs/checkpoints --seeds 0 --epochs 1000 --input_size 224 224 --device cuda:1 |
[링크 : https://github.com/AMCO-UniPD/moviad]
아래 사진을 모니터에 띄우고

예제 클로드(무료)로 작성하라고 했는데
처음에는 모니터 없어서 안된다고(아니.. ssh -X로 해서 떠야 하는데?)
그래서 웹으로 뚝딱 만들어 줌.. 오.. 나보다 100배 낫네

cudnn 비활성화 하고 (빨간색 부분)
웹캠으로 노트북 모니터 비추도록 해서 테스트. 음.. 잘 되는건지 안되는건지 미묘하다
| """ MoViAD STFPM + 웹캠 실시간 이상 감지 (브라우저 스트리밍 버전) ============================================================= cv2.imshow 없이 HTTP MJPEG 스트리밍으로 브라우저에서 확인합니다. → http://localhost:8080 에 접속하면 실시간 영상이 표시됩니다. [사전 준비] cd moviad && pip install -e ./ pip install opencv-python-headless torch torchvision [모델 학습] python main_scripts/main_stfpm.py \ --train \ --model_name mobilenet_v2 \ --ad_layers 4 7 10 \ --categories bottle \ --dataset_path /path/to/mvtec \ --checkpoint_dir ./checkpoints/stfpm \ --device cuda:0 \ --epochs 100 [실행] python webcam_stfpm_anomaly.py \ --checkpoint ./checkpoints/stfpm/bottle/mobilenet_v2_100ep_IMAGENET1K_V2_4_7_10_s0.pth.tar [REST 제어 API] (curl 또는 브라우저로 호출) GET /threshold/up 임계값 +0.02 GET /threshold/down 임계값 -0.02 GET /threshold/auto 자동 보정 (현재 점수 기준) GET /heatmap/toggle 히트맵 ON/OFF GET /reset 점수 히스토리 초기화 GET /status 현재 상태 JSON """ import argparse import sys import time import threading import json from datetime import datetime from pathlib import Path from http.server import HTTPServer, BaseHTTPRequestHandler from io import BytesIO import cv2 import numpy as np import torch from torchvision import transforms torch.backends.cudnn.enabled = False torch.backends.cudnn.benchmark = False try: from moviad.models import Stfpm except ImportError: sys.exit( "\n[ERROR] moviad 패키지를 찾을 수 없습니다.\n" " moviad 레포 루트에서 'pip install -e ./' 를 실행하세요.\n" ) # ────────────────────────────────────────────────────────────────── # 전역 공유 상태 (스레드 간 공유) # ────────────────────────────────────────────────────────────────── class AppState: def __init__(self): self.lock = threading.Lock() self.jpeg_frame = b"" # MJPEG 브라우저 전송용 프레임 self.threshold = 0.5 self.show_heat = True self.norm_score = 0.0 self.raw_score = 0.0 self.is_anomaly = False self.fps = 0.0 self.score_hist: list[float] = [] self.running = True STATE = AppState() # ────────────────────────────────────────────────────────────────── # 전처리 # ────────────────────────────────────────────────────────────────── IMG_SIZE = 224 RESIZE = 256 def make_preprocess(img_size=224): resize = int(img_size * 256 / 224) return transforms.Compose([ transforms.ToPILImage(), transforms.Resize(resize), transforms.CenterCrop(img_size), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std =[0.229, 0.224, 0.225]), ]) # ────────────────────────────────────────────────────────────────── # 모델 로드 # ────────────────────────────────────────────────────────────────── def load_stfpm(checkpoint_path: str, device: torch.device) -> Stfpm: print(f"[INFO] 체크포인트 로드: {checkpoint_path}") state = torch.load(checkpoint_path, map_location=device) model = Stfpm() model.load_state_dict(state, strict=False) model.to(device) model.eval() print(f"[INFO] 백본={model.backbone_model_name} " f"AD레이어={model.ad_layers} 입력크기={model.input_size}") return model # ────────────────────────────────────────────────────────────────── # 시각화 헬퍼 # ────────────────────────────────────────────────────────────────── C_NORMAL = (50, 205, 50) C_ANOMALY = (30, 30, 220) C_PANEL = (15, 15, 15) def score_to_heatmap(score_map: torch.Tensor, wh: tuple) -> np.ndarray: arr = score_map.squeeze().cpu().numpy() arr = cv2.normalize(arr, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8) heat = cv2.applyColorMap(arr, cv2.COLORMAP_JET) return cv2.resize(heat, wh) def draw_ui(frame, norm_score, raw_score, threshold, is_anomaly, fps, heatmap, show_heat) -> np.ndarray: out = frame.copy() h, w = out.shape[:2] if show_heat and heatmap is not None: out = cv2.addWeighted(out, 0.5, heatmap, 0.5, 0) color = C_ANOMALY if is_anomaly else C_NORMAL cv2.rectangle(out, (0, 0), (w-1, h-1), color, 6) # 반투명 상단 패널 panel_h = 100 overlay = out.copy() cv2.rectangle(overlay, (0, 0), (w, panel_h), C_PANEL, -1) cv2.addWeighted(overlay, 0.70, out, 0.30, 0, out) label = "[ ANOMALY ]" if is_anomaly else "[ NORMAL ]" cv2.putText(out, label, (10, 36), cv2.FONT_HERSHEY_DUPLEX, 1.1, color, 2, cv2.LINE_AA) info = (f"Score(norm): {norm_score:.4f} Raw: {raw_score:.4f} " f"Thr: {threshold:.4f} FPS: {fps:.1f}") cv2.putText(out, info, (10, 64), cv2.FONT_HERSHEY_SIMPLEX, 0.52, (210, 210, 210), 1, cv2.LINE_AA) cv2.putText(out, "http://localhost:8080 | /status /threshold/up /threshold/down /threshold/auto /heatmap/toggle /reset", (10, 88), cv2.FONT_HERSHEY_SIMPLEX, 0.38, (160, 160, 160), 1, cv2.LINE_AA) # 점수 바 bx, by0, by1 = 12, 74, 88 bw = w - 24 fill = int(bw * min(norm_score, 1.0)) tx = bx + int(bw * min(threshold, 1.0)) cv2.rectangle(out, (bx, by0), (bx+bw, by1), (55,55,55), -1) cv2.rectangle(out, (bx, by0), (bx+fill, by1), color, -1) cv2.line(out, (tx, by0-3), (tx, by1+3), (0, 255, 255), 2) return out # ────────────────────────────────────────────────────────────────── # 추론 스레드 # ────────────────────────────────────────────────────────────────── def inference_loop(model, preprocess, device, camera_id, width, height): cap = cv2.VideoCapture(camera_id) if not cap.isOpened(): print(f"[ERROR] 카메라(id={camera_id})를 열 수 없습니다.") STATE.running = False return cap.set(cv2.CAP_PROP_FRAME_WIDTH, width) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height) t_prev = time.time() fps = 0.0 save_dir = Path("captures") print(f"[INFO] 카메라 시작 (id={camera_id}, {width}x{height})") print("[INFO] 브라우저에서 http://localhost:8080 접속하세요\n") while STATE.running: ret, frame = cap.read() if not ret: time.sleep(0.03) continue # 추론 rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) tensor = preprocess(rgb).unsqueeze(0).to(device) with torch.no_grad(): score_maps, anomaly_scores = model(tensor) raw_score = float(anomaly_scores[0].cpu()) # 정규화 (min-max, 최근 500프레임) with STATE.lock: STATE.score_hist.append(raw_score) if len(STATE.score_hist) > 500: STATE.score_hist.pop(0) s_min = min(STATE.score_hist) s_max = max(STATE.score_hist) norm = (raw_score - s_min) / (s_max - s_min + 1e-8) threshold = STATE.threshold show_heat = STATE.show_heat is_anomaly = norm > threshold heatmap = score_to_heatmap(score_maps, (frame.shape[1], frame.shape[0])) # FPS t_now = time.time() fps = 0.9 * fps + 0.1 / max(t_now - t_prev, 1e-6) t_prev = t_now # 화면 렌더링 display = draw_ui(frame, norm, raw_score, threshold, is_anomaly, fps, heatmap, show_heat) # JPEG 인코딩 → 공유 버퍼 ok, buf = cv2.imencode('.jpg', display, [cv2.IMWRITE_JPEG_QUALITY, 85]) if ok: with STATE.lock: STATE.jpeg_frame = buf.tobytes() STATE.norm_score = norm STATE.raw_score = raw_score STATE.is_anomaly = is_anomaly STATE.fps = fps # 콘솔 출력 tag = "ANOMALY ⚠" if is_anomaly else "normal ✓ " print(f"\r[{tag}] norm={norm:.4f} raw={raw_score:.4f} " f"thr={threshold:.4f} fps={fps:.1f} ", end="", flush=True) cap.release() print("\n[INFO] 카메라 종료") # ────────────────────────────────────────────────────────────────── # HTTP 서버 (MJPEG + REST API) # ────────────────────────────────────────────────────────────────── HTML_PAGE = """\ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>MoViAD STFPM - Bottle Anomaly Detection</title> <style> body {{ background:#111; color:#eee; font-family:monospace; display:flex; flex-direction:column; align-items:center; margin:0; padding:16px; }} h2 {{ color:#4fc3f7; margin:8px 0; }} img {{ max-width:100%; border:3px solid #333; border-radius:6px; }} .controls {{ display:flex; gap:10px; flex-wrap:wrap; justify-content:center; margin:12px 0; }} button {{ padding:8px 18px; border:none; border-radius:5px; cursor:pointer; background:#1e88e5; color:#fff; font-size:14px; font-weight:bold; }} button:hover {{ background:#1565c0; }} button.danger {{ background:#e53935; }} button.success {{ background:#43a047; }} #status {{ background:#1e1e1e; border-radius:6px; padding:12px 20px; font-size:15px; min-width:340px; text-align:center; margin-top:6px; }} .normal {{ color:#69f0ae; font-weight:bold; }} .anomaly {{ color:#ff5252; font-weight:bold; }} </style> </head> <body> <h2>🔍 MoViAD STFPM — Bottle Anomaly Detection</h2> <img src="/stream" alt="webcam stream"> <div class="controls"> <button onclick="api('/threshold/up')" >Threshold ▲ (+0.02)</button> <button onclick="api('/threshold/down')">Threshold ▼ (−0.02)</button> <button class="success" onclick="api('/threshold/auto')">Auto Calibrate (t)</button> <button onclick="api('/heatmap/toggle')">Heatmap Toggle (h)</button> <button class="danger" onclick="api('/reset')" >Reset History (r)</button> </div> <div id="status">로딩 중...</div> <script> function api(path) {{ fetch(path).then(r=>r.json()).then(updateStatus); }} function updateStatus(d) {{ const cls = d.is_anomaly ? 'anomaly' : 'normal'; const lab = d.is_anomaly ? '⚠ ANOMALY' : '✓ NORMAL'; document.getElementById('status').innerHTML = `<span class="${{cls}}">${{lab}}</span> | `+ `norm: <b>${{d.norm_score.toFixed(4)}}</b> `+ `raw: ${{d.raw_score.toFixed(4)}} `+ `thr: <b>${{d.threshold.toFixed(4)}}</b> `+ `fps: ${{d.fps.toFixed(1)}} `+ `heatmap: ${{d.show_heat ? 'ON' : 'OFF'}}`; }} setInterval(() => fetch('/status').then(r=>r.json()).then(updateStatus), 500); </script> </body> </html> """ class StreamHandler(BaseHTTPRequestHandler): def log_message(self, *args): pass # 콘솔 노이즈 억제 def do_GET(self): p = self.path.split('?')[0] # ── MJPEG 스트림 ───────────────────────────── if p == '/stream': self.send_response(200) self.send_header('Content-Type', 'multipart/x-mixed-replace; boundary=frame') self.end_headers() try: while STATE.running: with STATE.lock: frame = STATE.jpeg_frame if frame: self.wfile.write( b"--frame\r\n" b"Content-Type: image/jpeg\r\n\r\n" + frame + b"\r\n" ) time.sleep(0.03) except (BrokenPipeError, ConnectionResetError): pass return # ── REST API ────────────────────────────────── with STATE.lock: if p == '/threshold/up': STATE.threshold = min(STATE.threshold + 0.02, 0.99) elif p == '/threshold/down': STATE.threshold = max(STATE.threshold - 0.02, 0.01) elif p == '/threshold/auto': STATE.threshold = float( np.clip(STATE.norm_score + 0.05, 0.01, 0.99) ) elif p == '/heatmap/toggle': STATE.show_heat = not STATE.show_heat elif p == '/reset': STATE.score_hist.clear() resp = { "threshold" : STATE.threshold, "norm_score": STATE.norm_score, "raw_score" : STATE.raw_score, "is_anomaly": STATE.is_anomaly, "fps" : STATE.fps, "show_heat" : STATE.show_heat, } # ── HTML 홈 ─────────────────────────────────── if p == '/': body = HTML_PAGE.encode() self.send_response(200) self.send_header('Content-Type', 'text/html; charset=utf-8') self.send_header('Content-Length', str(len(body))) self.end_headers() self.wfile.write(body) return body = json.dumps(resp).encode() self.send_response(200) self.send_header('Content-Type', 'application/json') self.send_header('Content-Length', str(len(body))) self.end_headers() self.wfile.write(body) # ────────────────────────────────────────────────────────────────── # 메인 # ────────────────────────────────────────────────────────────────── def run(args): # 디바이스 dev_str = args.device if "cuda" in dev_str and not torch.cuda.is_available(): print("[WARN] CUDA 불가 — CPU로 전환합니다.") dev_str = "cpu" device = torch.device(dev_str) # 모델 로드 model = load_stfpm(args.checkpoint, device) # 입력 크기 동기화 img_size = model.input_size[0] if model.input_size else 224 preprocess = make_preprocess(img_size) STATE.threshold = args.threshold # 추론 스레드 시작 t = threading.Thread( target=inference_loop, args=(model, preprocess, device, args.camera_id, args.width, args.height), daemon=True, ) t.start() # HTTP 서버 시작 server = HTTPServer(("0.0.0.0", args.port), StreamHandler) print(f"[INFO] HTTP 서버 시작: http://localhost:{args.port}") print("[INFO] Ctrl+C 로 종료\n") try: server.serve_forever() except KeyboardInterrupt: print("\n[INFO] 서버 종료") finally: STATE.running = False server.server_close() # ────────────────────────────────────────────────────────────────── # CLI # ────────────────────────────────────────────────────────────────── def parse_args(): p = argparse.ArgumentParser( description="MoViAD STFPM bottle — 웹캠 이상 감지 (브라우저 스트리밍)" ) p.add_argument("--checkpoint", type=str, required=True, help=".pth.tar 체크포인트 경로") p.add_argument("--camera_id", type=int, default=0) p.add_argument("--device", type=str, default="cuda:0") p.add_argument("--threshold", type=float, default=0.5) p.add_argument("--width", type=int, default=640) p.add_argument("--height", type=int, default=480) p.add_argument("--port", type=int, default=8080) return p.parse_args() if __name__ == "__main__": run(parse_args()) |
| moviad / 딥러닝 학습율 (0) | 2026.06.25 |
|---|---|
| moviad ssd-mobilenetv2 on imx8mp (0) | 2026.06.24 |
| moviad stfpm (0) | 2026.06.18 |
| ubuntu 26.04 + 3070 + tensorflow + python 3.14 + docker... (0) | 2026.06.17 |
| STFPM 실행 (0) | 2026.06.01 |
하.. 갈길이 멀다 ㅠㅠ
patchcore는 cudnn만 꺼주면 어떻게 되는데
stfpm은 소스가 문제라 .. -_-
| ~/src/moviad/main_scripts$ python3 main_stfpm.py --train --eval --model_name mobilenet_v2 --categories bottle --ad_layers 3 4 5 --boot_layer 2 --results_dirpath debug_outputs/metrics --checkpoint_dir debug_outputs/checkpoints --seeds 0 --epochs 3 --input_size 224 224 --device cuda:0 ERROR:root:micromind not found in current environment Traceback (most recent call last): File "/home/falinux/src/moviad/main_scripts/main_stfpm.py", line 12, in <module> from moviad.trainers.trainer_stfpm import train_param_grid_search ImportError: cannot import name 'train_param_grid_search' from 'moviad.trainers.trainer_stfpm' (/home/falinux/src/moviad/moviad/trainers/trainer_stfpm.py) |
| $ git log commit 5d547292f3e1e4402b91d2950b884be74a37900f (HEAD -> main, origin/main, origin/HEAD) Author: FrancescoBorsatti <francesco.borsatti.1@phd.unipd.it> Date: Mon Apr 13 18:16:40 2026 +0200 update readme |
괜히 verified가 붙은게 아닌듯. 저 버전으로는 내려가야 한다. merge 하다가 꼬인듯.

[링크 : https://github.com/AMCO-UniPD/moviad/blob/ec89d3e145615c9c1fbae69480f7da2eb4f9c606/moviad/trainers/trainer_stfpm.py] 있음(verified)
+
아래 커밋으로 이동해버리고(!)
| git checkout ec89d3e145615c9c1fbae69480f7da2eb4f9c606 |
실행하면 안된다!
정해진 경로에 넣으란거지? -_-+
| ~/src/moviad/main_scripts$ python3 main_stfpm.py --train --eval --model_name mobilenet_v2 --categories bottle --ad_layers 3 4 5 --boot_layer 2 --results_dirpath debug_outputs/metrics --checkpoint_dir debug_outputs/checkpoints --seeds 0 --epochs 3 --input_size 224 224 --device cuda:0 ERROR:root:micromind not found in current environment Training with params: {'dataset_path': '../../datasets/mvtec/', 'categories': ['bottle'], 'ad_layers': [[3, 4, 5]], 'epochs': [3], 'seeds': [0], 'batch_size': 64, 'backbone_model_name': 'mobilenet_v2', 'device': device(type='cuda', index=0), 'img_input_size': [224, 224], 'img_output_size': (224, 224), 'early_stopping': None, 'student_bootstrap_layer': [2], 'checkpoint_dir': 'debug_outputs/checkpoints', 'normalize_dataset': True, 'log_dirpath': None, 'contamination_ratio': None, 'test_dataset': False} TRAIN | cat: bottle, ad_layers: [3, 4, 5], epochs: 3, seed: 0, early_stopping: None, bootstrap: 2 Traceback (most recent call last): File "/home/minimonk/src/moviad/main_scripts/main_stfpm.py", line 405, in <module> raise e File "/home/minimonk/src/moviad/main_scripts/main_stfpm.py", line 387, in <module> main(args) File "/home/minimonk/src/moviad/main_scripts/main_stfpm.py", line 86, in main trained_models_filepaths = train_param_grid_search(params) File "/home/minimonk/src/moviad/moviad/trainers/trainer_stfpm.py", line 321, in train_param_grid_search log, snapshot_path = train_param_grid_step( File "/home/minimonk/src/moviad/moviad/trainers/trainer_stfpm.py", line 209, in train_param_grid_step train_dataset.load_dataset() File "/home/minimonk/src/moviad/moviad/datasets/mvtec/mvtec_dataset.py", line 175, in load_dataset raise RuntimeError(msg) RuntimeError: Found 0 images in ../../datasets/mvtec/bottle |
| moviad ssd-mobilenetv2 on imx8mp (0) | 2026.06.24 |
|---|---|
| moviad / stftpm / 1080 ti / webcam feat claude (0) | 2026.06.19 |
| ubuntu 26.04 + 3070 + tensorflow + python 3.14 + docker... (0) | 2026.06.17 |
| STFPM 실행 (0) | 2026.06.01 |
| 딥러닝 학습 관련(epoch, loss) (0) | 2026.05.27 |
/v1/chat/completions 통해서 문맥을 유지할때 어떻게 구현되나 했더니
llama-swap 에서 대화내용을 보니 이해된다.
assistant에 ai 대답을 넣는다고만 해서 복수개면 어떻게 하나 했는데

UI 상으로는 이렇게 나오고

로그 상으로는 아래와 같이 나온다
1번 째 질문 "하이하이"

2번 쩨 질문 "엉 왜 refused"
그리고 이전 대화를 messages의 배열에 순서대로 넣으면
가장 마지막 대화를 기준으로 답을 주게 되는걸려나?
당연(?) 하지만 reasoning은 빼고 순수 응답 내용만 assistant에 넣어서 보낸다.

| mogrify를 이용한 이미지 증강, 배경색 설정 (0) | 2026.06.25 |
|---|---|
| local llm - mcp (0) | 2026.06.20 |
| gemma4-e4b mtp..? (0) | 2026.06.18 |
| openai api 변경에 따른 llama.cpp / llama-swap 리포트 차이 (0) | 2026.06.18 |
| llama-swap 버전 업데이트! (0) | 2026.06.18 |
변환해서 내꺼에서 돌려보니 성능 차이가 없...다?
내꺼 그래픽 카드가 구려서 그런가.. 그게 아니라면.. 변환을 잘못했다거나
llama.cpp 에서 지원은 안한다거나 그런건가?
| MTP x | MTP 8 | MTP 4 | MTP 3 | MTP 2 | MTP 1 | |
| 직접 | 61.1 | 18.6 | 40.9 | 58.4 | 55.6 | 61.7 |
| unsloth | 61.1 | 45.0 | 58.6 | 62.4 | 68.4 |
-------
비교군
| $ /mnt/Downloads/llama-b9553/llama-cli --model /mnt/Downloads/model/gemma4-e4b/gemma-4-E4B-it-Q4_K_M.gguf -mm ./model/gemma4-e4b/mmproj-F16.gguf -sm none #--reasoning off ...wnloads/llama-b9553/llama-cli 6435MiB > 안녕? [ Prompt: 105.7 t/s | Generation: 61.1 t/s ] > 빨라? [ Prompt: 51.1 t/s | Generation: 60.6 t/s ] |
직접 변환(양자화 안함)
| $ /mnt/Downloads/llama-b9553/llama-cli --model /mnt/Downloads/model/gemma4-e4b/gemma-4-E4B-it-Q4_K_M.gguf -mm ./model/gemma4-e4b/mmproj-F16.gguf --model-draft ./gemma-4-E4B-it-assistant/gemma-4-E4B-it-assistant.gguf --spec-type draft-mtp --spec-draft-n-max 8 -fit off -ngl 999 -fa on -sm none #--reasoning off ...wnloads/llama-b9553/llama-cli 6735MiB > 안녕? [ Prompt: 101.1 t/s | Generation: 18.6 t/s ] > 빨라? [ Prompt: 351.2 t/s | Generation: 16.9 t/s ] $ /mnt/Downloads/llama-b9553/llama-cli --model /mnt/Downloads/model/gemma4-e4b/gemma-4-E4B-it-Q4_K_M.gguf -mm ./model/gemma4-e4b/mmproj-F16.gguf --model-draft ./gemma-4-E4B-it-assistant/gemma-4-E4B-it-assistant.gguf --spec-type draft-mtp --spec-draft-n-max 4 -fit off -ngl 999 -fa on -sm none #--reasoning off ...wnloads/llama-b9553/llama-cli 6735MiB > 안녕? [ Prompt: 292.5 t/s | Generation: 40.9 t/s ] > 빨라? [ Prompt: 207.7 t/s | Generation: 46.6 t/s ] $ /mnt/Downloads/llama-b9553/llama-cli --model /mnt/Downloads/model/gemma4-e4b/gemma-4-E4B-it-Q4_K_M.gguf -mm ./model/gemma4-e4b/mmproj-F16.gguf --model-draft ./gemma-4-E4B-it-assistant/gemma-4-E4B-it-assistant.gguf --spec-type draft-mtp --spec-draft-n-max 3 -fit off -ngl 999 -fa on -sm none #--reasoning off ...wnloads/llama-b9553/llama-cli 6735MiB > 안녕? [ Prompt: 398.8 t/s | Generation: 58.4 t/s ] > 빨라? [ Prompt: 236.3 t/s | Generation: 60.9 t/s ] $ /mnt/Downloads/llama-b9553/llama-cli --model /mnt/Downloads/model/gemma4-e4b/gemma-4-E4B-it-Q4_K_M.gguf -mm ./model/gemma4-e4b/mmproj-F16.gguf --model-draft ./gemma-4-E4B-it-assistant/gemma-4-E4B-it-assistant.gguf --spec-type draft-mtp --spec-draft-n-max 2 -fit off -ngl 999 -fa on -sm none #--reasoning off ...wnloads/llama-b9553/llama-cli 6735MiB > 안녕? [ Prompt: 360.7 t/s | Generation: 55.6 t/s ] > 빨라? [ Prompt: 284.9 t/s | Generation: 62.7 t/s ] $ /mnt/Downloads/llama-b9553/llama-cli --model /mnt/Downloads/model/gemma4-e4b/gemma-4-E4B-it-Q4_K_M.gguf -mm ./model/gemma4-e4b/mmproj-F16.gguf --model-draft ./gemma-4-E4B-it-assistant/gemma-4-E4B-it-assistant.gguf --spec-type draft-mtp --spec-draft-n-max 1 -fit off -ngl 999 -fa on -sm none #--reasoning off ...wnloads/llama-b9553/llama-cli 6735MiB > 안녕? [ Prompt: 314.1 t/s | Generation: 61.7 t/s ] > 빨라? [ Prompt: 441.2 t/s | Generation: 63.7 t/s ] |
unsloth 모델
[링크 : https://huggingface.co/unsloth/gemma-4-E4B-it-GGUF]
| $ /mnt/Downloads/llama-b9553/llama-cli --model /mnt/Downloads/model/gemma4-e4b/gemma-4-E4B-it-Q4_K_M.gguf -mm ./model/gemma4-e4b/mmproj-F16.gguf --model-draft ./gemma-4-E4B-it-assistant/mtp-gemma-4-E4B-it.gguf --spec-type draft-mtp --spec-draft-n-max 4 -fit off -ngl 999 -fa on -sm none #--reasoning off ...wnloads/llama-b9553/llama-cli 6666MiB > 안녕? [ Prompt: 42.4 t/s | Generation: 45.0 t/s ] > 빨라? [ Prompt: 302.6 t/s | Generation: 47.4 t/s ] $ /mnt/Downloads/llama-b9553/llama-cli --model /mnt/Downloads/model/gemma4-e4b/gemma-4-E4B-it-Q4_K_M.gguf -mm ./model/gemma4-e4b/mmproj-F16.gguf --model-draft ./gemma-4-E4B-it-assistant/mtp-gemma-4-E4B-it.gguf --spec-type draft-mtp --spec-draft-n-max 3 -fit off -ngl 999 -fa on -sm none #--reasoning off ...wnloads/llama-b9553/llama-cli 6666MiB > 안녕? [ Prompt: 174.0 t/s | Generation: 58.6 t/s ] > 빨라? [ Prompt: 327.7 t/s | Generation: 60.2 t/s ] $ /mnt/Downloads/llama-b9553/llama-cli --model /mnt/Downloads/model/gemma4-e4b/gemma-4-E4B-it-Q4_K_M.gguf -mm ./model/gemma4-e4b/mmproj-F16.gguf --model-draft ./gemma-4-E4B-it-assistant/mtp-gemma-4-E4B-it.gguf --spec-type draft-mtp --spec-draft-n-max 2 -fit off -ngl 999 -fa on -sm none #--reasoning off ...wnloads/llama-b9553/llama-cli 6666MiB > 안녕? [ Prompt: 98.5 t/s | Generation: 62.4 t/s ] > 빨라? [ Prompt: 331.4 t/s | Generation: 64.7 t/s ] $ /mnt/Downloads/llama-b9553/llama-cli --model /mnt/Downloads/model/gemma4-e4b/gemma-4-E4B-it-Q4_K_M.gguf -mm ./model/gemma4-e4b/mmproj-F16.gguf --model-draft ./gemma-4-E4B-it-assistant/mtp-gemma-4-E4B-it.gguf --spec-type draft-mtp --spec-draft-n-max 1 -fit off -ngl 999 -fa on -sm none #--reasoning off ...wnloads/llama-b9553/llama-cli 6666MiB > 안녕? [ Prompt: 168.7 t/s | Generation: 68.4 t/s ] > 빨라? [ Prompt: 343.2 t/s | Generation: 67.2 t/s ] |
[링크 : https://huggingface.co/google/gemma-4-E4B-it-assistant]
| local llm - mcp (0) | 2026.06.20 |
|---|---|
| llama-swap 구현 (채팅) (0) | 2026.06.18 |
| openai api 변경에 따른 llama.cpp / llama-swap 리포트 차이 (0) | 2026.06.18 |
| llama-swap 버전 업데이트! (0) | 2026.06.18 |
| stable diffusion --device-id (0) | 2026.06.18 |
그런데 208 이던 228 이던
client.chat.completions.create 함수를
client.responses.create 로 바꾸었더니 prompt speed / gen speed가 출력되지 않는다.
reasoning off 하기 위해서는 함수를 바꾸어야 하고. 바꾸면 리포트가 안되고 흐음..
걍 서버에서 끄고 해야하나? (llama-cli --reasoning off)

| llama-swap 구현 (채팅) (0) | 2026.06.18 |
|---|---|
| gemma4-e4b mtp..? (0) | 2026.06.18 |
| llama-swap 버전 업데이트! (0) | 2026.06.18 |
| stable diffusion --device-id (0) | 2026.06.18 |
| stable diffusion illustruousXL LoRA (0) | 2026.06.15 |
208 에서 228로 올렸더니
1. config.yaml 의 명시적 사용
기존에는 config.yaml을 바로 가져가더니(llama-swap 과 동일 경로에서) 이제는 명시적으로 지정해주어야 한다.1
| $ ./llama-swap 2026/06/18 12:43:40 ERROR -config is required $ ./llama-swap --help Usage of ./llama-swap: -config string path to config file (required) -listen string listen address (default :8080 or :8443 for TLS) -tls-cert-file string TLS certificate file -tls-key-file string TLS key file -version show version and exit -watch-config reload config on file change |
2. 모니터링 추가
performance 탭에서 그래프가 생긴것 같다. 오오 이쁜데?

| gemma4-e4b mtp..? (0) | 2026.06.18 |
|---|---|
| openai api 변경에 따른 llama.cpp / llama-swap 리포트 차이 (0) | 2026.06.18 |
| stable diffusion --device-id (0) | 2026.06.18 |
| stable diffusion illustruousXL LoRA (0) | 2026.06.15 |
| statble diffusion XL 해상도 (0) | 2026.06.15 |
버전에 따라 안 먹는게 있는지 라고 하기에는
저번에 잘 한거 같기도 한데 잘 모르겠네
아무튼 아래처럼 바꾸어 주면 자로딘다.
| ./webui.sh --server-name=0.0.0.0 --device-id=1 --api --medvram |
| CUDA_VISIBLE_DEVICES=1 ./webui.sh --server-name=0.0.0.0 --api --medvram |
일단 현재 버전(?)은 아래와 같은 상태.
저번에 확장 깔다가 꼬여서 1.7 버전이라고 받아둔걸로 했더니 안되는건가..
| $ git history commit 1937682a20f7f0442311a1ede68f9f0cb480163b (HEAD -> dev, origin/dev) Merge: 76759a18 fd0f475a Author: w-e-w <40751091+w-e-w@users.noreply.github.com> Date: Mon Mar 2 16:00:53 2026 +0900 Merge pull request #17313 from WhizZest/fix-setuptools-version Fix the issue of `pip install 'setuptools<70'` failing in cmd $ git branch * dev master $ git remote -v origin https://github.com/AUTOMATIC1111/stable-diffusion-webui.git (fetch) origin https://github.com/AUTOMATIC1111/stable-diffusion-webui.git (push) |
| openai api 변경에 따른 llama.cpp / llama-swap 리포트 차이 (0) | 2026.06.18 |
|---|---|
| llama-swap 버전 업데이트! (0) | 2026.06.18 |
| stable diffusion illustruousXL LoRA (0) | 2026.06.15 |
| statble diffusion XL 해상도 (0) | 2026.06.15 |
| stable diffusion, control net (0) | 2026.06.14 |
개발환경 구축하려고 이것저것 보고 있는데
구형 모델을 쓰려고 하다보니(ssd mobilenet v3) 영 환경 잡는것 자체가 쉽지 않아 보인다.
[링크 : https://www.tensorflow.org/install/docker?hl=ko] 텐서플로우 docker
[링크 : https://github.com/NVIDIA/nvidia-docker] 요건 deprecated
[링크 : https://github.com/NVIDIA/nvidia-container-toolkit] 요걸 쓰라고
tensorflow 2.21.0
2026.03.07 release
지원 파이썬 버전 3.13 최대.

[링크 : https://pypi.org/project/tensorflow/]
tensorflow-gpu 2.12.0
2023.01.25 release
[링크 : https://pypi.org/project/tensorflow-gpu/]
그 와중에 우분투 26.04 의 파이썬 버전이 3.14 대이고
| $ python3 --version Python 3.14.4 |
텐서플로우는 지원버전이 없다고 배째고
| $ pip3 install tensorflow ERROR: Could not find a version that satisfies the requirement tensorflow (from versions: none) ERROR: No matching distribution found for tensorflow |
난 어짜피 gpu 가속받을거니까~ 하고 실행하는데 에러
| $ pip3 install tensorflow-gpu Collecting tensorflow-gpu Using cached tensorflow-gpu-2.12.0.tar.gz (2.6 kB) Installing build dependencies ... done Getting requirements to build wheel ... error error: subprocess-exited-with-error × Getting requirements to build wheel did not run successfully. │ exit code: 1 ╰─> [77 lines of output] Traceback (most recent call last): File "/tmp/pip-build-env-kb1b92jj/overlay/lib/python3.14/site-packages/setuptools/_vendor/packaging/requirements.py", line 36, in __init__ parsed = _parse_requirement(requirement_string) File "/tmp/pip-build-env-kb1b92jj/overlay/lib/python3.14/site-packages/setuptools/_vendor/packaging/_parser.py", line 71, in parse_requirement return _parse_requirement(Tokenizer(source, rules=DEFAULT_RULES)) File "/tmp/pip-build-env-kb1b92jj/overlay/lib/python3.14/site-packages/setuptools/_vendor/packaging/_parser.py", line 89, in _parse_requirement url, specifier, marker = _parse_requirement_details(tokenizer) ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^ File "/tmp/pip-build-env-kb1b92jj/overlay/lib/python3.14/site-packages/setuptools/_vendor/packaging/_parser.py", line 135, in _parse_requirement_details marker = _parse_requirement_marker( tokenizer, ...<5 lines>... ), ) File "/tmp/pip-build-env-kb1b92jj/overlay/lib/python3.14/site-packages/setuptools/_vendor/packaging/_parser.py", line 156, in _parse_requirement_marker tokenizer.raise_syntax_error( ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ f"Expected {expected} or end", ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ span_start=span_start, ^^^^^^^^^^^^^^^^^^^^^^ span_end=None, ^^^^^^^^^^^^^^ ) ^ File "/tmp/pip-build-env-kb1b92jj/overlay/lib/python3.14/site-packages/setuptools/_vendor/packaging/_tokenizer.py", line 166, in raise_syntax_error raise ParserSyntaxError( ...<3 lines>... ) packaging._tokenizer.ParserSyntaxError: Expected semicolon (after name with no version specifier) or end python_version>"3.7" ^ The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/home/minimonk/venv/lib/python3.14/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in <module> main() ~~~~^^ File "/home/minimonk/venv/lib/python3.14/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main json_out["return_val"] = hook(**hook_input["kwargs"]) ~~~~^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/minimonk/venv/lib/python3.14/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel return hook(config_settings) File "/tmp/pip-build-env-kb1b92jj/overlay/lib/python3.14/site-packages/setuptools/build_meta.py", line 333, in get_requires_for_build_wheel return self._get_build_requires(config_settings, requirements=[]) ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/tmp/pip-build-env-kb1b92jj/overlay/lib/python3.14/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires self.run_setup() ~~~~~~~~~~~~~~^^ File "/tmp/pip-build-env-kb1b92jj/overlay/lib/python3.14/site-packages/setuptools/build_meta.py", line 520, in run_setup super().run_setup(setup_script=setup_script) ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/tmp/pip-build-env-kb1b92jj/overlay/lib/python3.14/site-packages/setuptools/build_meta.py", line 317, in run_setup exec(code, locals()) ~~~~^^^^^^^^^^^^^^^^ File "<string>", line 40, in <module> File "/tmp/pip-build-env-kb1b92jj/overlay/lib/python3.14/site-packages/setuptools/__init__.py", line 114, in setup _install_setup_requires(attrs) ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^ File "/tmp/pip-build-env-kb1b92jj/overlay/lib/python3.14/site-packages/setuptools/__init__.py", line 85, in _install_setup_requires dist.parse_config_files(ignore_option_errors=True) ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/tmp/pip-build-env-kb1b92jj/overlay/lib/python3.14/site-packages/setuptools/dist.py", line 764, in parse_config_files self._finalize_requires() ~~~~~~~~~~~~~~~~~~~~~~~^^ File "/tmp/pip-build-env-kb1b92jj/overlay/lib/python3.14/site-packages/setuptools/dist.py", line 382, in _finalize_requires self._normalize_requires() ~~~~~~~~~~~~~~~~~~~~~~~~^^ File "/tmp/pip-build-env-kb1b92jj/overlay/lib/python3.14/site-packages/setuptools/dist.py", line 400, in _normalize_requires self.install_requires = list_(map(str, _reqs.parse(install_requires))) ~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/tmp/pip-build-env-kb1b92jj/overlay/lib/python3.14/site-packages/setuptools/_vendor/packaging/requirements.py", line 38, in __init__ raise InvalidRequirement(str(e)) from e packaging.requirements.InvalidRequirement: Expected semicolon (after name with no version specifier) or end python_version>"3.7" ^ [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. error: subprocess-exited-with-error × Getting requirements to build wheel did not run successfully. │ exit code: 1 ╰─> See above for output. note: This error originates from a subprocess, and is likely not a problem with pip. |
tensorflow 도 이제 인기가 없어졌다고 해야하나.. 지는 해가 되어버렸나 보다.
[링크 : https://github.com/tensorflow/tensorflow/issues/102890]
짧고 명확하다... deprecation. 후..
| TensorFlow Object Detection API TensorFlow 2.2 TensorFlow 1.15 Python 3.6 Deprecation |
[링크 : https://github.com/tensorflow/models/blob/master/research/object_detection/README.md]
keras도 희망이 없고, pytorch도 좋은소리 안나오고 어떻게 해야하나..
by GPT

by claude

| moviad / stftpm / 1080 ti / webcam feat claude (0) | 2026.06.19 |
|---|---|
| moviad stfpm (0) | 2026.06.18 |
| STFPM 실행 (0) | 2026.06.01 |
| 딥러닝 학습 관련(epoch, loss) (0) | 2026.05.27 |
| NAS - Neural Architecture Search (0) | 2026.05.21 |