fix(gguf_server): fail-closed on null logprob / empty probs from llama-server

#3
Files changed (1) hide show
  1. startlux_decision/gguf_server.py +9 -1
startlux_decision/gguf_server.py CHANGED
@@ -48,8 +48,11 @@ class GGUFDecision(StartLuxDecision):
48
  with urllib.request.urlopen(urllib.request.Request(self.url, body, {"Content-Type": "application/json"}), timeout=900) as r:
49
  out = json.loads(r.read())
50
  rows = out.get("completion_probabilities", out.get("probs"))
 
 
51
  got = {t["id"]: t["logprob"] for t in rows[0]["top_logprobs"]}
52
- if all(t in got for t in targets):
 
53
  return [got[t] for t in targets]
54
  raise RuntimeError("option letters missing from llama-server's log-probabilities")
55
 
@@ -60,6 +63,11 @@ class GGUFDecision(StartLuxDecision):
60
  ids, _ = J.render_ids(r, self.tok, order, max_length=self.max_length)
61
  jobs.append((ids, len(order)))
62
  outs = list(self.pool.map(lambda j: self._letter_logprobs(*j), jobs))
 
 
 
 
 
63
  return [torch.tensor(o, dtype=torch.float32) for o in outs], sum(len(i) for i, _ in jobs)
64
 
65
 
 
48
  with urllib.request.urlopen(urllib.request.Request(self.url, body, {"Content-Type": "application/json"}), timeout=900) as r:
49
  out = json.loads(r.read())
50
  rows = out.get("completion_probabilities", out.get("probs"))
51
+ if not rows:
52
+ continue # fail-closed:服务器未回概率,换更大 n_probs 重试
53
  got = {t["id"]: t["logprob"] for t in rows[0]["top_logprobs"]}
54
+ # 除「字母缺失」外还须排除「logprob 为 null」(上游 llama 失败态),否则下游 torch.tensor 裸崩
55
+ if all(t in got and got[t] is not None for t in targets):
56
  return [got[t] for t in targets]
57
  raise RuntimeError("option letters missing from llama-server's log-probabilities")
58
 
 
63
  ids, _ = J.render_ids(r, self.tok, order, max_length=self.max_length)
64
  jobs.append((ids, len(order)))
65
  outs = list(self.pool.map(lambda j: self._letter_logprobs(*j), jobs))
66
+ flat = [v for o in outs for v in o]
67
+ if any(v is None for v in flat): # fail-closed:上游 llama 返回 null logprob,不得让 torch.tensor 抛裸 TypeError
68
+ raise RuntimeError(
69
+ f"llama-server returned null logprob for {sum(v is None for v in flat)} option letter(s); "
70
+ "see /tmp/llama-server.log (set SD27B_DIAG=1 to surface its tail)")
71
  return [torch.tensor(o, dtype=torch.float32) for o in outs], sum(len(i) for i, _ in jobs)
72
 
73