From fa98aea6581a357d451c1bcbcf187925b95fdb61 Mon Sep 17 00:00:00 2001 From: Dest1n1 Date: Mon, 5 Aug 2024 11:20:30 +0800 Subject: [PATCH] feat(ui/model-page): generation section --- server/app.py | 14 +- ui/bun.lockb | Bin 257820 -> 268710 bytes ui/package.json | 1 + ui/src/components/model/model-card.tsx | 184 ++++++++++++++++++++++++- ui/src/types/model.ts | 10 ++ 5 files changed, 198 insertions(+), 11 deletions(-) create mode 100644 ui/src/types/model.ts diff --git a/server/app.py b/server/app.py index c9b9ad24..049edf32 100644 --- a/server/app.py +++ b/server/app.py @@ -298,16 +298,16 @@ def dictionary_custom_input(dictionary_name: str, input_text: str): return Response(content=msgpack.packb(sample), media_type="application/x-msgpack") @app.post("/model/generate") -def model_generate(input_text: str, max_length: int = 128, top_k: int = 50, top_p: float = 0.95): +def model_generate(input_text: str, max_new_tokens: int = 128, top_k: int = 50, top_p: float = 0.95, return_logits_top_k: int = 5): dictionaries = client.list_dictionaries(dictionary_series=dictionary_series) assert len(dictionaries) > 0, "No dictionaries found. Model name cannot be inferred." model = get_model(dictionaries[0]) with torch.no_grad(): input = model.to_tokens(input_text, prepend_bos=False) - output = model.generate(input, max_length=max_length, top_k=top_k, top_p=top_p) + output = model.generate(input, max_new_tokens=max_new_tokens, top_k=top_k, top_p=top_p) output = output.clone() logits = model.forward(output) - logits_topk = [torch.topk(l, top_k) for l in logits[0]] + logits_topk = [torch.topk(l, return_logits_top_k) for l in logits[0]] result = { "context": [ bytearray([byte_decoder[c] for c in t]) @@ -327,10 +327,10 @@ def model_generate(input_text: str, max_length: int = 128, top_k: int = 50, top_ @app.post("/dictionaries/{dictionary_name}/features/{feature_index}/interpret") def feature_interpretation( - dictionary_name: str, - feature_index: int, - type: str, - custom_interpretation: str | None = None, + dictionary_name: str, + feature_index: int, + type: str, + custom_interpretation: str | None = None, ): model = get_model(dictionary_name) if type == "custom": diff --git a/ui/bun.lockb b/ui/bun.lockb index 6ee4bfe920e3f0ad8446c937eaafc9ba7fefda40..2194dfddb1c161204ce83b5b03dbd6367b2cb2ce 100755 GIT binary patch delta 48934 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

=(>S%3NokNuOhBkd9S4-KoK`I$~YT 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 { + const [selectedTokenGroupIndices, setSelectedTokenGroupIndices] = useState([]); + const toggleSelectedTokenGroupIndex = (tokenGroupIndex: number) => { + setSelectedTokenGroupIndices((prev) => + prev.includes(tokenGroupIndex) ? prev.filter((t) => t !== tokenGroupIndex) : [...prev, tokenGroupIndex] + ); + }; + + const decoder = new TextDecoder("utf-8", { fatal: true }); + const tokens = sample.context.map((token, i) => ({ + token, + inputMask: sample.inputMask[i], + logits: zip(sample.logits[i], sample.logitsTokens[i]).map(([logits, logitsTokens]) => ({ + logits, + logitsTokens, + })), + })); + const tokenGroups = tokens.reduce<[(typeof tokens)[], typeof tokens]>( + ([groups, currentGroup], token) => { + const newGroup = [...currentGroup, token]; + try { + decoder.decode(mergeUint8Arrays(newGroup.map((t) => t.token))); + return [[...groups, newGroup], []]; + } catch { + return [groups, newGroup]; + } + }, + [[], []] + )[0]; + const selectedTokenGroups = selectedTokenGroupIndices.map((i) => tokenGroups[i]); + const selectedTokens = selectedTokenGroups.flatMap((t) => t); + + const data = selectedTokens.map((token) => + Object.assign( + {}, + ...token.logits.map((logits, j) => ({ + [`logits-${j}`]: logits.logits, + [`logits-token-${j}`]: logits.logitsTokens.reduce( + (acc, b) => + b < 32 || b > 126 ? `${acc}\\x${b.toString(16).padStart(2, "0")}` : `${acc}${String.fromCharCode(b)}`, + "" + ), + })), + { + name: token.token.reduce( + (acc, b) => + b < 32 || b > 126 ? `${acc}\\x${b.toString(16).padStart(2, "0")}` : `${acc}${String.fromCharCode(b)}`, + "" + ), + } + ) + ); + + const colors = ["#8884d8", "#82ca9d", "#ffc658", "#ff7300", "#d6d6d6"]; + + return ( +

+ + cn( + "hover:shadow-lg hover:text-gray-600 cursor-pointer", + selectedTokenGroupIndices.some((t) => t === tokenIndex) && "bg-orange-500" + ) + } + tokenGroupProps={(_, i) => ({ + onClick: () => toggleSelectedTokenGroupIndex(i), + })} + /> + + {selectedTokens.length > 0 && ( + + + + + + + {selectedTokens[0].logits.map((_, i) => ( + + + + ))} + + + )} +
+ ); +}; const ModelCustomInputArea = () => { const [customInput, setCustomInput] = useState(""); - const submit = async () => {}; - const disabled = false; + const [maxNewTokens, setMaxNewTokens] = useState(128); + const [topK, setTopK] = useState(50); + const [topP, setTopP] = useState(0.95); + const [logitTopK, setLogitTopK] = useState(5); + const [sample, setSample] = useState(null); + const [state, submit] = useAsyncFn(async () => { + if (!customInput) { + alert("Please enter your input."); + return; + } + const sample = await fetch( + `${import.meta.env.VITE_BACKEND_URL}/model/generate?input_text=${encodeURIComponent( + customInput + )}&max_new_tokens=${encodeURIComponent(maxNewTokens.toString())}&top_k=${encodeURIComponent( + topK.toString() + )}&top_p=${encodeURIComponent(topP.toString())}&return_logits_top_k=${encodeURIComponent(logitTopK.toString())}`, + { + method: "POST", + headers: { + Accept: "application/x-msgpack", + }, + } + ) + .then(async (res) => { + if (!res.ok) { + throw new Error(await res.text()); + } + return res; + }) + .then(async (res) => await res.arrayBuffer()) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + .then((res) => decode(new Uint8Array(res)) as any) + .then((res) => + camelcaseKeys(res, { + deep: true, + stopPaths: ["context", "logits_tokens"], + }) + ) + .then((res) => ModelGenerationSchema.parse(res)); + setSample(sample); + }, [customInput]); + return (
-

Custom Input

+

Generation

+
+ Max new tokens: + setMaxNewTokens(parseInt(e.target.value))} + /> + Top K: + setTopK(parseInt(e.target.value))} + /> + Top P: + setTopP(parseFloat(e.target.value))} + /> + Logit Top K: + setLogitTopK(parseInt(e.target.value))} + /> +