From 4057915a5f9b5e239d087358443ac0cb7105e61f Mon Sep 17 00:00:00 2001 From: Dest1n1 Date: Sun, 11 Aug 2024 02:01:56 +0800 Subject: [PATCH] feat(ui/model-page): steering --- ui/bun.lockb | Bin 268710 -> 287763 bytes ui/package.json | 6 + ui/src/components/model/model-card.tsx | 602 +++++++++++++++++---- ui/src/components/ui/badge.tsx | 36 ++ ui/src/components/ui/combobox.tsx | 92 ++++ ui/src/components/ui/command.tsx | 153 ++++++ ui/src/components/ui/data-table.tsx | 11 +- ui/src/components/ui/dialog.tsx | 120 ++++ ui/src/components/ui/multiple-selector.tsx | 558 +++++++++++++++++++ ui/src/components/ui/pagination.tsx | 4 +- ui/src/components/ui/popover.tsx | 29 + ui/src/components/ui/switch.tsx | 27 + ui/src/components/ui/tooltip.tsx | 28 + ui/src/tanstack.d.ts | 9 + ui/src/types/model.ts | 8 + 15 files changed, 1587 insertions(+), 96 deletions(-) create mode 100644 ui/src/components/ui/badge.tsx create mode 100644 ui/src/components/ui/combobox.tsx create mode 100644 ui/src/components/ui/command.tsx create mode 100644 ui/src/components/ui/dialog.tsx create mode 100644 ui/src/components/ui/multiple-selector.tsx create mode 100644 ui/src/components/ui/popover.tsx create mode 100644 ui/src/components/ui/switch.tsx create mode 100644 ui/src/components/ui/tooltip.tsx create mode 100644 ui/src/tanstack.d.ts diff --git a/ui/bun.lockb b/ui/bun.lockb index 2194dfddb1c161204ce83b5b03dbd6367b2cb2ce..3bd98f13d10a69fb09c2597a8aeb034bdfc74120 100755 GIT binary patch delta 66470 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%0AN;Q+}+JTO-)x|rdt_y)0 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 { +const SAEInfo = ({ + saeInfo, + saeSettings, + onSteerFeature, + setSAESettings, +}: { + saeInfo: { + name: string; + featureActs: { + featureActIndex: number; + featureAct: number; + maxFeatureAct: number; + }[]; + }; + saeSettings: { sortedBySum: boolean }; + onSteerFeature?: (name: string, featureIndex: number) => void; + setSAESettings: (settings: { sortedBySum: boolean }) => void; +}) => { + const navigate = useNavigate(); + + const columns: ColumnDef<{ + featureActIndex: number; + featureAct: number; + maxFeatureAct: number; + }>[] = [ + { + accessorKey: "featureActIndex", + header: () => ( +
+ Feature +
+ ), + cell: ({ row }) => ( +
+ +
+ ), + }, + { + accessorKey: "featureAct", + header: () => ( +
+ Activation +
+ ), + cell: ({ row }) => ( +
+ {row.original.featureAct.toFixed(3)} +
+ ), + }, + { + id: "actions", + enableHiding: false, + cell: ({ row }) => ( + + + + + + Actions + onSteerFeature?.(saeInfo.name, row.original.featureActIndex)}> + Steer feature + + + { + navigate( + `/features?dictionary=${encodeURIComponent(saeInfo.name)}&featureIndex=${ + row.original.featureActIndex + }` + ); + }} + > + View feature + + + + ), + meta: { + headerClassName: "w-16", + cellClassName: "py-0", + }, + }, + ]; + + return ( +
+
+
Features from {saeInfo.name}:
+ setSAESettings({ ...saeSettings, sortedBySum: pressed })} + > + Sort by sum + +
+ +
+ ); +}; + +const LogitsInfo = ({ + logits, +}: { + logits: { + logits: number; + token: Uint8Array; + }[]; +}) => { + const maxLogits = Math.max(...logits.map((logit) => logit.logits)); + const columns: ColumnDef<{ + logits: number; + token: Uint8Array; + }>[] = [ + { + accessorKey: "token", + header: () => ( +
+ Token +
+ ), + cell: ({ row }) => ( +
+ {hex(row.original)} +
+ ), + }, + { + accessorKey: "logits", + header: () => ( +
+ Logits +
+ ), + cell: ({ row }) => ( +
+ {row.original.logits.toFixed(3)} +
+ ), + }, + ]; + + return ( +
+
Logits:
+ +
+ ); +}; + +const LogitsBarChart = ({ + tokens, +}: { + tokens: { + logits: { + logits: number; + token: Uint8Array; + }[]; + token: Uint8Array; + }[]; +}) => { + const data = tokens.map((token) => + Object.assign( + {}, + ...token.logits.map((logit, j) => ({ + [`logits-${j}`]: logit.logits, + [`logits-token-${j}`]: hex(logit), + })), + { + name: hex(token), + } + ) + ); + + const colors = ["#8884d8", "#82ca9d", "#ffc658", "#ff7300", "#d6d6d6"]; + + return ( + + + + + + + {tokens[0].logits.slice(0, 5).map((_, i) => ( + + + + ))} + + + ); +}; + +const ModelSample = ({ + sample, + onSteerFeature, +}: { + sample: ModelGeneration; + onSteerFeature?: (name: string, featureIndex: number) => void; +}) => { const [selectedTokenGroupIndices, setSelectedTokenGroupIndices] = useState([]); const toggleSelectedTokenGroupIndex = (tokenGroupIndex: number) => { setSelectedTokenGroupIndices((prev) => - prev.includes(tokenGroupIndex) ? prev.filter((t) => t !== tokenGroupIndex) : [...prev, tokenGroupIndex] + prev.includes(tokenGroupIndex) + ? prev.filter((t) => t !== tokenGroupIndex) + : [...prev, tokenGroupIndex].sort((a, b) => a - b) ); }; + const [saeSettings, setSAESettings] = useState<{ [name: string]: { sortedBySum: boolean } }>({}); + const getSAESettings = (name: string) => saeSettings[name] || { sortedBySum: false }; + useEffect(() => { setSelectedTokenGroupIndices([]); }, [sample]); - const tokens = zip(sample.context, sample.inputMask, sample.logits, sample.logitsTokens).map( - ([token, inputMask, logits, logitsTokens]) => ({ - token, - inputMask, - logits: zip(logits, logitsTokens).map(([logits, token]) => ({ - logits, + const tokens = useMemo(() => { + const saeInfo = + sample.saeInfo.length > 0 + ? zip( + ...sample.saeInfo.map((sae) => + zip(sae.featureActsIndices, sae.featureActs, sae.maxFeatureActs).map( + ([featureActIndex, featureAct, maxFeatureAct]) => ({ + name: sae.name, + featureActs: zip(featureActIndex, featureAct, maxFeatureAct).map( + ([featureActIndex, featureAct, maxFeatureAct]) => ({ + featureActIndex, + featureAct, + maxFeatureAct, + }) + ), + }) + ) + ) + ) + : sample.context.map(() => []); + + return zip(sample.context, sample.inputMask, sample.logits, sample.logitsTokens, saeInfo).map( + ([token, inputMask, logits, logitsTokens, saeInfo]) => ({ token, + inputMask, + logits: zip(logits, logitsTokens).map(([logits, token]) => ({ + logits, + token, + })), + saeInfo, + }) + ); + }, [sample]); + + type Token = (typeof tokens)[0]; + + const sortTokenInfo = (tokens: Token[]) => { + const featureActSum = tokens.reduce((acc, token) => { + token.saeInfo.forEach((saeInfo) => { + saeInfo.featureActs.forEach((featureAct) => { + acc[saeInfo.name] = acc[saeInfo.name] || {}; + acc[saeInfo.name][featureAct.featureActIndex.toString()] = + acc[saeInfo.name][featureAct.featureActIndex.toString()] || 0; + acc[saeInfo.name][featureAct.featureActIndex.toString()] += featureAct.featureAct; + }); + }); + return acc; + }, {} as { [name: string]: { [featureIndex: string]: number } }); + + return tokens.map((token) => ({ + ...token, + logits: token.logits.sort((a, b) => b.logits - a.logits), + saeInfo: token.saeInfo.map((saeInfo) => ({ + ...saeInfo, + featureActs: getSAESettings(saeInfo.name).sortedBySum + ? saeInfo.featureActs.sort( + (a, b) => + featureActSum[saeInfo.name][b.featureActIndex.toString()] - + featureActSum[saeInfo.name][a.featureActIndex.toString()] + ) + : saeInfo.featureActs.sort((a, b) => b.featureAct - a.featureAct), })), - }) - ); + })); + }; + const tokenGroups = groupToken(tokens); const tokenGroupPositions = countTokenGroupPositions(tokenGroups); const selectedTokenGroups = selectedTokenGroupIndices.map((i) => tokenGroups[i]); - const selectedTokens = selectedTokenGroups.flatMap((t) => t); + const selectedTokens = sortTokenInfo(selectedTokenGroups.flatMap((t) => t)); const selectedTokenGroupPositions = selectedTokenGroupIndices.map((i) => tokenGroupPositions[i]); const selectedTokenPositions = selectedTokenGroups.flatMap((t, i) => t.map((_, j) => selectedTokenGroupPositions[i] + j) ); - const data = selectedTokens.map((token) => - Object.assign( - {}, - ...token.logits.map((logits, j) => ({ - [`logits-${j}`]: logits.logits, - [`logits-token-${j}`]: hex(logits), - })), - { - name: hex(token), - } - ) - ); - - const colors = ["#8884d8", "#82ca9d", "#ffc658", "#ff7300", "#d6d6d6"]; - return (
{ })} /> - {selectedTokens.length > 0 &&

Detail of Selected Tokens:

} + {selectedTokens.length > 0 && ( +

+ Detail of {selectedTokens.length} Selected Token{selectedTokens.length > 1 ? "s" : ""}: +

+ )} {selectedTokens.map((token, i) => ( -
-
-
-
Token:
-
{hex(token)}
-
Position:
-
{selectedTokenPositions[i]}
-
-
-
-

Top Logits:

-
- {token.logits.map((logit, j) => ( - -
{hex(logit)}
-
- {logit.logits.toFixed(3)} -
-
- ))} -
+
+
+
Token:
+
{hex(token)}
+
Position:
+
{selectedTokenPositions[i]}
+
+ + {token.saeInfo.map((saeInfo, j) => ( + setSAESettings({ ...saeSettings, [saeInfo.name]: settings })} + /> + ))} +
{i < selectedTokens.length - 1 && } ))} - {selectedTokens.length > 0 && ( - - - - - - - {selectedTokens[0].logits.map((_, i) => ( - - - - ))} - - - )} + {selectedTokens.length > 0 && }
); }; const ModelCustomInputArea = () => { const [customInput, setCustomInput] = useState(""); + const [doGenerate, setDoGenerate] = useState(true); const [maxNewTokens, setMaxNewTokens] = useState(128); const [topK, setTopK] = useState(50); const [topP, setTopP] = useState(0.95); - const [logitTopK, setLogitTopK] = useState(5); + const [selectedDictionaries, setSelectedDictionaries] = useState([]); + const [steerings, setSteerings] = useState< + { + sae: string | null; + featureIndex: number; + steeringType: "times" | "ablate" | "add" | "set"; + steeringValue: number | null; + }[] + >([{ sae: null, featureIndex: 0, steeringType: "times", steeringValue: 1 }]); + const [sample, setSample] = useState(null); + + const [dictionariesState, fetchDictionaries] = useAsyncFn(async () => { + return await fetch(`${import.meta.env.VITE_BACKEND_URL}/dictionaries`) + .then(async (res) => await res.json()) + .then((res) => z.array(z.string()).parse(res)); + }); + + useMount(async () => { + await fetchDictionaries(); + }); + 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", - }, - } - ) + const sample = await fetch(`${import.meta.env.VITE_BACKEND_URL}/model/generate`, { + method: "POST", + body: JSON.stringify( + snakecaseKeys({ + inputText: customInput, + maxNewTokens: doGenerate ? maxNewTokens : 0, + topK, + topP, + saes: selectedDictionaries, + steerings: steerings.filter((s) => s.sae !== null), + }) + ), + headers: { + Accept: "application/x-msgpack", + "Content-Type": "application/json", + }, + }) .then(async (res) => { if (!res.ok) { throw new Error(await res.text()); @@ -170,15 +459,24 @@ const ModelCustomInputArea = () => { ) .then((res) => ModelGenerationSchema.parse(res)); setSample(sample); - }, [customInput]); + }, [doGenerate, customInput, maxNewTokens, topK, topP, selectedDictionaries]); return (

Generation

+ Do generate: +
+ + + {doGenerate + ? "Model will generate new contents based on the following configuration." + : "Model will only perceive the given input."} + +
Max new tokens: { /> Top K: { /> Top P: setTopP(parseFloat(e.target.value))} /> - Logit Top K: - + SAEs: + setLogitTopK(parseInt(e.target.value))} + disabled={state.loading} + options={dictionariesState.value?.map((name) => ({ value: name, label: name })) || []} + commandProps={{ + className: "col-span-3", + }} + hidePlaceholderWhenSelected + placeholder="Bind SAEs to the language model to see features activated in the generation." + value={selectedDictionaries.map((name) => ({ value: name, label: name }))} + onChange={(value) => setSelectedDictionaries(value.map((v) => v.value))} + emptyIndicator={ +

No dictionaries found.

+ } /> + {selectedDictionaries.length > 0 && + steerings.map((steering, i) => ( + + Steering {i + 1}: +
+
+ { + setSteerings((prev) => prev.map((s, j) => (i === j ? { ...s, sae: value } : s))); + }} + options={selectedDictionaries.map((name) => ({ value: name, label: name }))} + disabled={state.loading} + placeholder="Select a dictionary to steer the generation." + commandPlaceholder="Search for a selected dictionary..." + emptyIndicator="No options found" + /> + # + { + setSteerings((prev) => + prev.map((s, j) => (i === j ? { ...s, featureIndex: parseInt(e.target.value) } : s)) + ); + }} + /> + + { + setSteerings((prev) => + prev.map((s, j) => (i === j ? { ...s, steeringValue: parseFloat(e.target.value) } : s)) + ); + }} + /> +
+
+ steerings.length > 1 + ? setSteerings((prev) => prev.filter((_, j) => i !== j)) + : setSteerings([{ sae: null, featureIndex: 0, steeringType: "times", steeringValue: 1 }]) + } + > + +
+
+ setSteerings((prev) => [ + ...prev.slice(0, i + 1), + { sae: null, featureIndex: 0, steeringType: "times", steeringValue: 1 }, + ...prev.slice(i + 1), + ]) + } + > + +
+
+
+ ))}