JuliaLang / IJulia.jl

Julia kernel for Jupyter
MIT License
2.78k stars 409 forks source link

Add precompile statements to reduce startup latency #1074

Open MasonProtter opened 1 year ago

MasonProtter commented 1 year ago

So @timholy and I have done a little preliminary looking into adding precompile statements to reduce the latency of IJulia kernels, and it seems to us that a major problem is that there's no clear way to run a PrecompileTools.jl or SnoopCompile.jl workflow to actually get the relevant precompile statements from a running notebook, so we're forced to resort to --trace-compile kernels.

@stevengj do you have any insight into how we might be able to set up a PrecompileTools.jl workflow that starts up and spins down a kernel during precompilation?

stevengj commented 1 year ago

Maybe just copy https://github.com/JuliaLang/IJulia.jl/blob/cc2a9bf61a2515596b177339f9a3514de8c38573/src/kernel.jl but comment out the final IJulia.waitloop() line? Then run julia kernelcopy.jl.

I guess you could also add an environment variable or something to kernel.jl to make it do this, so that you don't need to edit the file. Or do some other refactoring of kernel.jl.

You may have to undo the IO redirects at the end, i.e.

redirect_stdout(IJulia.orig_stdout[])
redirect_stderr(IJulia.orig_stderr[])
redirect_stdin(IJulia.orig_stdin[])

Potentially you could also manually call IJulia.execute_request, e.g. something like:

execute_request(requests[], Msg(String[], Dict(), Dict(["code"=>"nothing\n", "silent"=>true, "user_expressions"=>[]])))
MasonProtter commented 1 year ago

I've been trying to get that to work but so far have not had any success. lots of those functions simply error if run during precompilation, and what I am able to keep without errors don't seem to have any effect on the time to start for a kernel.