webui: fix prompt progress ETA calculation (#18468)
* webui: fix prompt progress ETA calculation * handle case done === 0
This commit is contained in:
parent
c9a3b40d65
commit
51a48720b8
Binary file not shown.
|
|
@ -6,6 +6,7 @@ export interface LiveProcessingStats {
|
||||||
totalTokens: number;
|
totalTokens: number;
|
||||||
timeMs: number;
|
timeMs: number;
|
||||||
tokensPerSecond: number;
|
tokensPerSecond: number;
|
||||||
|
etaSecs?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface LiveGenerationStats {
|
export interface LiveGenerationStats {
|
||||||
|
|
@ -82,6 +83,15 @@ export function useProcessingState(): UseProcessingStateReturn {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function getETASecs(done: number, total: number, elapsedMs: number): number | undefined {
|
||||||
|
const elapsedSecs = elapsedMs / 1000;
|
||||||
|
const progressETASecs =
|
||||||
|
done === 0 || elapsedSecs < 0.5
|
||||||
|
? undefined // can be the case for the 0% progress report
|
||||||
|
: elapsedSecs * (total / done - 1);
|
||||||
|
return progressETASecs;
|
||||||
|
}
|
||||||
|
|
||||||
function startMonitoring(): void {
|
function startMonitoring(): void {
|
||||||
if (isMonitoring) return;
|
if (isMonitoring) return;
|
||||||
isMonitoring = true;
|
isMonitoring = true;
|
||||||
|
|
@ -178,6 +188,12 @@ export function useProcessingState(): UseProcessingStateReturn {
|
||||||
const actualProcessed = processed - cache;
|
const actualProcessed = processed - cache;
|
||||||
const actualTotal = total - cache;
|
const actualTotal = total - cache;
|
||||||
const percent = Math.round((actualProcessed / actualTotal) * 100);
|
const percent = Math.round((actualProcessed / actualTotal) * 100);
|
||||||
|
const eta = getETASecs(actualProcessed, actualTotal, processingState.promptProgress.time_ms);
|
||||||
|
|
||||||
|
if (eta !== undefined) {
|
||||||
|
const etaSecs = Math.ceil(eta);
|
||||||
|
return `Processing ${percent}% (ETA: ${etaSecs}s)`;
|
||||||
|
}
|
||||||
|
|
||||||
return `Processing ${percent}%`;
|
return `Processing ${percent}%`;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -303,11 +303,17 @@ class ChatStore {
|
||||||
const currentConfig = config();
|
const currentConfig = config();
|
||||||
const outputTokensMax = currentConfig.max_tokens || -1;
|
const outputTokensMax = currentConfig.max_tokens || -1;
|
||||||
|
|
||||||
|
// Note: for timings data, the n_prompt does NOT include cache tokens
|
||||||
const contextUsed = promptTokens + cacheTokens + predictedTokens;
|
const contextUsed = promptTokens + cacheTokens + predictedTokens;
|
||||||
const outputTokensUsed = predictedTokens;
|
const outputTokensUsed = predictedTokens;
|
||||||
|
|
||||||
|
// Note: for prompt progress, the "processed" DOES include cache tokens
|
||||||
|
// we need to exclude them to get the real prompt tokens processed count
|
||||||
|
const progressCache = promptProgress?.cache || 0;
|
||||||
|
const progressActualDone = (promptProgress?.processed ?? 0) - progressCache;
|
||||||
|
const progressActualTotal = (promptProgress?.total ?? 0) - progressCache;
|
||||||
const progressPercent = promptProgress
|
const progressPercent = promptProgress
|
||||||
? Math.round((promptProgress.processed / promptProgress.total) * 100)
|
? Math.round((progressActualDone / progressActualTotal) * 100)
|
||||||
: undefined;
|
: undefined;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue