| 788 | fprintf(fp, "{\n \"source\":\"ds4\",\n \"model\":"); |
| 789 | json_write_string(fp, cfg->engine.model_path, strlen(cfg->engine.model_path)); |
| 790 | fprintf(fp, |
| 791 | ",\n \"backend\":\"%s\",\n \"quant_bits\":%d,\n" |
| 792 | " \"prompt_tokens\":%d,\n \"ctx\":%d,\n \"vocab\":%d,\n", |
| 793 | ds4_backend_name(cfg->engine.backend), |
| 794 | ds4_engine_routed_quant_bits(engine), |
| 795 | prompt->len, |
| 796 | cfg->gen.ctx_size, |
| 797 | vocab); |
| 798 | const int argmax = ds4_session_argmax(session); |
| 799 | fputs(" \"argmax_token\":", fp); |
| 800 | json_write_token(fp, engine, argmax); |
| 801 | fprintf(fp, ",\n \"argmax_logit\":%.9g,\n \"logits\":[", logits[argmax]); |
| 802 | for (int i = 0; i < vocab; i++) { |
| 803 | if (i) fputc(',', fp); |
| 804 | if ((i % 8) == 0) fputs("\n ", fp); |
| 805 | if (isfinite(logits[i])) { |
| 806 | fprintf(fp, "%.9g", logits[i]); |
| 807 | } else { |
| 808 | fputs("null", fp); |
| 809 | } |
| 810 | } |
| 811 | fputs("\n ]\n}\n", fp); |
| 812 | if (fclose(fp) != 0) { |
| 813 | fprintf(stderr, "ds4: failed to close --dump-logits file: %s\n", cfg->gen.dump_logits_path); |
| 814 | free(logits); |
| 815 | ds4_session_free(session); |
| 816 | return 1; |
| 817 | } |
| 818 | |
| 819 | free(logits); |
| 820 | ds4_session_free(session); |
| 821 | return 0; |
| 822 | } |
| 823 | |
| 824 | static int run_logprob_dump(ds4_engine *engine, const cli_config *cfg, const ds4_tokens *prompt) { |
| 825 | ds4_session *session = NULL; |
| 826 | if (ds4_session_create(&session, engine, cfg->gen.ctx_size) != 0) { |
| 827 | fprintf(stderr, "ds4: --dump-logprobs requires a graph session backend\n"); |
| 828 | return 1; |
| 829 | } |
| 830 | if (cli_wait_distributed_route(cfg, session) != 0) { |
| 831 | ds4_session_free(session); |
| 832 | return 1; |
| 833 | } |
| 834 | |
| 835 | char err[160]; |
| 836 | cli_prefill_progress progress = { |
| 837 | .base_tokens = 0, |
| 838 | .input_tokens = prompt->len, |
| 839 | .use_color = ds4_log_is_tty(stderr), |
| 840 | }; |
| 841 | ds4_session_set_progress(session, cli_prefill_progress_cb, &progress); |
| 842 | ds4_session_set_display_progress(session, |
| 843 | progress.use_color ? cli_prefill_progress_cb : NULL, |
| 844 | progress.use_color ? &progress : NULL); |
| 845 | if (ds4_session_sync(session, prompt, err, sizeof(err)) != 0) { |
| 846 | ds4_session_set_progress(session, NULL, NULL); |
| 847 | ds4_session_set_display_progress(session, NULL, NULL); |
no test coverage detected