| 871 | fprintf(fp, "{\n \"source\":\"ds4\",\n \"prompt_tokens\":%d,\n \"ctx\":%d,\n \"top_k\":%d,\n \"steps\":[\n", |
| 872 | prompt->len, cfg->gen.ctx_size, k); |
| 873 | int generated = 0; |
| 874 | int max_tokens = cfg->gen.n_predict; |
| 875 | int room = ds4_session_ctx(session) - ds4_session_pos(session); |
| 876 | if (room <= 1) max_tokens = 0; |
| 877 | else if (max_tokens > room - 1) max_tokens = room - 1; |
| 878 | for (; generated < max_tokens; generated++) { |
| 879 | int n = ds4_session_top_logprobs(session, scores, k); |
| 880 | int token = ds4_session_argmax(session); |
| 881 | if (generated) fputs(",\n", fp); |
| 882 | fprintf(fp, " {\"step\":%d,\"selected\":", generated); |
| 883 | json_write_token(fp, engine, token); |
| 884 | fputs(",\"top_logprobs\":[", fp); |
| 885 | for (int i = 0; i < n && scores[i].id >= 0; i++) { |
| 886 | if (i) fputc(',', fp); |
| 887 | fputs("{\"token\":", fp); |
| 888 | json_write_token(fp, engine, scores[i].id); |
| 889 | fprintf(fp, ",\"logit\":%.9g,\"logprob\":%.9g}", scores[i].logit, scores[i].logprob); |
| 890 | } |
| 891 | fputs("]}", fp); |
| 892 | |
| 893 | if (ds4_token_is_stop(engine, token)) break; |
| 894 | if (ds4_session_eval(session, token, err, sizeof(err)) != 0) { |
| 895 | fprintf(stderr, "ds4: decode failed while dumping logprobs: %s\n", err); |
| 896 | free(scores); |
| 897 | fclose(fp); |
| 898 | ds4_session_free(session); |
| 899 | return 1; |
| 900 | } |
| 901 | } |
| 902 | fputs("\n ]\n}\n", fp); |
| 903 | if (fclose(fp) != 0) { |
| 904 | fprintf(stderr, "ds4: failed to close --dump-logprobs file: %s\n", cfg->gen.dump_logprobs_path); |
| 905 | free(scores); |
| 906 | ds4_session_free(session); |
| 907 | return 1; |
| 908 | } |
| 909 | free(scores); |
| 910 | ds4_session_free(session); |
| 911 | return 0; |
| 912 | } |
| 913 | |
| 914 | static void print_diag_token(FILE *fp, ds4_engine *engine, int token) { |
| 915 | fputs("{\"token\":", fp); |
| 916 | json_write_token(fp, engine, token); |
| 917 | fputc('}', fp); |
| 918 | } |
| 919 | |
| 920 | static void print_diag_top(FILE *fp, ds4_engine *engine, const char *label, |
| 921 | const ds4_token_score *scores, int n) { |
| 922 | fprintf(fp, "%s:", label); |
| 923 | for (int i = 0; i < n && scores[i].id >= 0; i++) { |
| 924 | fputc(' ', fp); |
| 925 | json_write_token(fp, engine, scores[i].id); |
| 926 | fprintf(fp, "@%.6g", scores[i].logit); |
| 927 | } |
| 928 | fputc('\n', fp); |
| 929 | } |
| 930 |
no test coverage detected