Spaces:
Runtime error
Runtime error
generation parameters added
Browse files
app.py
CHANGED
@@ -269,7 +269,7 @@ outro_text ="""
|
|
269 |
- [] generation history stating which function and orig/generated returns. (use State ??). do it as comments in the code?
|
270 |
- [~] display errros/issues to the user (raise gr.Error could be one idea, but highlighting in the code would be awesome) currently adds a comment to the code.
|
271 |
- [] generate whole shaders (via prompts guidance, recursive from errors)
|
272 |
-
- [] accordion with generation parameters (as pipeline_kwargs?) look up starcoder playround and take "inspiration" from there
|
273 |
- [] support FIM task for better model context
|
274 |
- [~] include some context for prompt (title, comments before a functions) - now works with the first comment inside a function body (has to be first)
|
275 |
- [] gradio examples
|
@@ -356,7 +356,7 @@ def get_full_replacement(orig_code, retn_start_idx, retn_end_idx, prediction) ->
|
|
356 |
variation = orig_code[:retn_start_idx] + generated + orig_code[retn_end_idx:]
|
357 |
return variation
|
358 |
|
359 |
-
def alter_return(orig_code, func_idx, pipeline=PIPE): #default pipeline can't be passed as gloabl?
|
360 |
"""
|
361 |
Replaces the return statement of a function with a generated one.
|
362 |
Args:
|
@@ -378,6 +378,8 @@ def alter_return(orig_code, func_idx, pipeline=PIPE): #default pipeline can't be
|
|
378 |
else:
|
379 |
raise gr.Error(f"func_idx must be int or str, not {type(func_idx)}")
|
380 |
|
|
|
|
|
381 |
retrns = []
|
382 |
retrn_start_idx = orig_code.find("return")
|
383 |
while retrn_start_idx != -1:
|
@@ -392,8 +394,7 @@ def alter_return(orig_code, func_idx, pipeline=PIPE): #default pipeline can't be
|
|
392 |
retrn_start_idx, retrn_end_idx = retrns[func_idx]
|
393 |
model_context = orig_code[:retrn_start_idx] #TODO: maximal context?
|
394 |
model_inp = model_context + "return"
|
395 |
-
|
396 |
-
pipe_generation = pipeline(model_inp, max_new_tokens=new_toks, return_full_text=False)[0]["generated_text"] #pipeline kwargs are missing?!
|
397 |
altered_code = get_full_replacement(orig_code, retrn_start_idx+7, retrn_end_idx, pipe_generation)
|
398 |
|
399 |
return altered_code
|
@@ -409,8 +410,15 @@ def _line_chr2char(text, line_idx, chr_idx):
|
|
409 |
char_idx += chr_idx
|
410 |
return char_idx
|
411 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
412 |
|
413 |
-
def alter_body(old_code, func_id, funcs_list: list, pipeline=PIPE):
|
414 |
"""
|
415 |
Replaces the body of a function with a generated one.
|
416 |
Args:
|
@@ -430,6 +438,7 @@ def alter_body(old_code, func_id, funcs_list: list, pipeline=PIPE):
|
|
430 |
func_node = funcs_list[func_id]
|
431 |
print(f"using for generation: {func_node=}")
|
432 |
|
|
|
433 |
|
434 |
print(f"{pipeline=}") # check if default even loaded
|
435 |
if pipeline is None:
|
@@ -449,10 +458,7 @@ def alter_body(old_code, func_id, funcs_list: list, pipeline=PIPE):
|
|
449 |
# print(second_child.text.decode())
|
450 |
model_context += " { \n " + second_child.text.decode()
|
451 |
print(f"{model_context=}")
|
452 |
-
|
453 |
-
|
454 |
-
print(f"generating up to {num_new_tokens} after {model_context!r}")
|
455 |
-
generation = pipeline(model_context, max_new_tokens=num_new_tokens, return_full_text=False)[0]["generated_text"]
|
456 |
print(f"{generation=}")
|
457 |
ctx_with_generation = model_context + generation
|
458 |
print(f"{ctx_with_generation=}")
|
@@ -493,10 +499,50 @@ with gr.Blocks() as site:
|
|
493 |
model_cp = gr.Textbox(value="Vipitis/santacoder-finetuned-Shadertoys-fine", label="Model Checkpoint (Enter to load!)", interactive=True)
|
494 |
sample_idx = gr.Slider(minimum=0, maximum=num_samples, value=3211, label="pick sample from dataset", step=1.0)
|
495 |
func_dropdown = gr.Dropdown(value=["0: edit the Code (or load a shader) to update this dropdown"], label="chose a function to modify") #breaks if I add a string in before that? #TODO: use type="index" to get int - always gives None?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
496 |
with gr.Row():
|
497 |
gen_return_button = gr.Button("generate a alternate return statement", label="generate return")
|
498 |
gen_func_button = gr.Button("generate an alternate function body", label="generate function")
|
499 |
-
# update_funcs_button = gr.Button("update functions", label="update functions")
|
500 |
with gr.Row():
|
501 |
with gr.Column():
|
502 |
source_embed = gr.HTML('<iframe width="640" height="360" frameborder="0" src="" allowfullscreen></iframe>', label="How this shader originally renders")
|
@@ -514,7 +560,7 @@ with gr.Blocks() as site:
|
|
514 |
model_cp.submit(fn=_make_pipeline, inputs=[model_cp], outputs=[pipe]) # how can we trigger this on load?
|
515 |
sample_idx.release(fn=grab_sample, inputs=[sample_idx], outputs=[sample_pass, sample_code, source_embed])
|
516 |
gen_return_button.click(fn=alter_return, inputs=[sample_code, func_dropdown, pipe], outputs=[sample_code])
|
517 |
-
gen_func_button.click(fn=alter_body, inputs=[sample_code, func_dropdown, funcs, pipe], outputs=[sample_code, pipe])
|
518 |
sample_code.change(fn=list_dropdown, inputs=[sample_code], outputs=[funcs, func_dropdown]) # to update this after generation, so spans aren't messed up
|
519 |
sample_code.change(fn=make_iframe, inputs=[sample_code], outputs=[our_embed]) #twice could cause issues, find better ways.
|
520 |
site.launch()
|
|
|
269 |
- [] generation history stating which function and orig/generated returns. (use State ??). do it as comments in the code?
|
270 |
- [~] display errros/issues to the user (raise gr.Error could be one idea, but highlighting in the code would be awesome) currently adds a comment to the code.
|
271 |
- [] generate whole shaders (via prompts guidance, recursive from errors)
|
272 |
+
- [x] accordion with generation parameters (as pipeline_kwargs?) look up starcoder playround and take "inspiration" from there (implemented for both buttons, untested)
|
273 |
- [] support FIM task for better model context
|
274 |
- [~] include some context for prompt (title, comments before a functions) - now works with the first comment inside a function body (has to be first)
|
275 |
- [] gradio examples
|
|
|
356 |
variation = orig_code[:retn_start_idx] + generated + orig_code[retn_end_idx:]
|
357 |
return variation
|
358 |
|
359 |
+
def alter_return(orig_code, func_idx, temperature, max_new_tokens, top_p, repetition_penalty, pipeline=PIPE): #default pipeline can't be passed as gloabl?
|
360 |
"""
|
361 |
Replaces the return statement of a function with a generated one.
|
362 |
Args:
|
|
|
378 |
else:
|
379 |
raise gr.Error(f"func_idx must be int or str, not {type(func_idx)}")
|
380 |
|
381 |
+
generation_kwargs = _combine_generation_kwargs(temperature, max_new_tokens, top_p, repetition_penalty)
|
382 |
+
|
383 |
retrns = []
|
384 |
retrn_start_idx = orig_code.find("return")
|
385 |
while retrn_start_idx != -1:
|
|
|
394 |
retrn_start_idx, retrn_end_idx = retrns[func_idx]
|
395 |
model_context = orig_code[:retrn_start_idx] #TODO: maximal context?
|
396 |
model_inp = model_context + "return"
|
397 |
+
pipe_generation = pipeline(model_inp, return_full_text=False, **generation_kwargs)[0]["generated_text"] #pipeline kwargs are missing?!
|
|
|
398 |
altered_code = get_full_replacement(orig_code, retrn_start_idx+7, retrn_end_idx, pipe_generation)
|
399 |
|
400 |
return altered_code
|
|
|
410 |
char_idx += chr_idx
|
411 |
return char_idx
|
412 |
|
413 |
+
def _combine_generation_kwargs(temperature, max_new_tokens, top_p, repetition_penalty):
|
414 |
+
gen_kwargs = {}
|
415 |
+
gen_kwargs["temperature"] = temperature
|
416 |
+
gen_kwargs["max_new_tokens"] = max_new_tokens
|
417 |
+
gen_kwargs["top_p"] = top_p
|
418 |
+
gen_kwargs["repetition_penalty"] = repetition_penalty
|
419 |
+
return gen_kwargs
|
420 |
|
421 |
+
def alter_body(old_code, func_id, funcs_list: list, temperature, max_new_tokens, top_p, repetition_penalty, pipeline=PIPE):
|
422 |
"""
|
423 |
Replaces the body of a function with a generated one.
|
424 |
Args:
|
|
|
438 |
func_node = funcs_list[func_id]
|
439 |
print(f"using for generation: {func_node=}")
|
440 |
|
441 |
+
generation_kwargs = _combine_generation_kwargs(temperature, max_new_tokens, top_p, repetition_penalty)
|
442 |
|
443 |
print(f"{pipeline=}") # check if default even loaded
|
444 |
if pipeline is None:
|
|
|
458 |
# print(second_child.text.decode())
|
459 |
model_context += " { \n " + second_child.text.decode()
|
460 |
print(f"{model_context=}")
|
461 |
+
generation = pipeline(model_context, return_full_text=False, **generation_kwargs)[0]["generated_text"]
|
|
|
|
|
|
|
462 |
print(f"{generation=}")
|
463 |
ctx_with_generation = model_context + generation
|
464 |
print(f"{ctx_with_generation=}")
|
|
|
499 |
model_cp = gr.Textbox(value="Vipitis/santacoder-finetuned-Shadertoys-fine", label="Model Checkpoint (Enter to load!)", interactive=True)
|
500 |
sample_idx = gr.Slider(minimum=0, maximum=num_samples, value=3211, label="pick sample from dataset", step=1.0)
|
501 |
func_dropdown = gr.Dropdown(value=["0: edit the Code (or load a shader) to update this dropdown"], label="chose a function to modify") #breaks if I add a string in before that? #TODO: use type="index" to get int - always gives None?
|
502 |
+
with gr.Accordion("Advanced settings", open=False): # from: https://huggingface.co/spaces/bigcode/bigcode-playground/blob/main/app.py
|
503 |
+
with gr.Row():
|
504 |
+
column_1, column_2 = gr.Column(), gr.Column()
|
505 |
+
with column_1:
|
506 |
+
temperature = gr.Slider(
|
507 |
+
label="Temperature",
|
508 |
+
value=0.0, #start out at 0 to do greedy? or will there be an error?
|
509 |
+
minimum=0.0,
|
510 |
+
maximum=1.0,
|
511 |
+
step=0.05,
|
512 |
+
interactive=True,
|
513 |
+
info="Higher values produce more diverse outputs",
|
514 |
+
)
|
515 |
+
max_new_tokens = gr.Slider(
|
516 |
+
label="Max new tokens",
|
517 |
+
value=160,
|
518 |
+
minimum=0,
|
519 |
+
maximum=2048, #this could be inferred from the model?
|
520 |
+
step=32,
|
521 |
+
interactive=True,
|
522 |
+
info="The maximum numbers of new tokens",
|
523 |
+
)
|
524 |
+
with column_2:
|
525 |
+
top_p = gr.Slider(
|
526 |
+
label="Top-p (nucleus sampling)",
|
527 |
+
value=0.30,
|
528 |
+
minimum=0.0,
|
529 |
+
maximum=1,
|
530 |
+
step=0.05,
|
531 |
+
interactive=True,
|
532 |
+
info="Higher values sample more low-probability tokens",
|
533 |
+
)
|
534 |
+
repetition_penalty = gr.Slider(
|
535 |
+
label="Repetition penalty",
|
536 |
+
value=1.2,
|
537 |
+
minimum=1.0,
|
538 |
+
maximum=2.0,
|
539 |
+
step=0.05,
|
540 |
+
interactive=True,
|
541 |
+
info="Penalize repeated tokens",
|
542 |
+
)
|
543 |
with gr.Row():
|
544 |
gen_return_button = gr.Button("generate a alternate return statement", label="generate return")
|
545 |
gen_func_button = gr.Button("generate an alternate function body", label="generate function")
|
|
|
546 |
with gr.Row():
|
547 |
with gr.Column():
|
548 |
source_embed = gr.HTML('<iframe width="640" height="360" frameborder="0" src="" allowfullscreen></iframe>', label="How this shader originally renders")
|
|
|
560 |
model_cp.submit(fn=_make_pipeline, inputs=[model_cp], outputs=[pipe]) # how can we trigger this on load?
|
561 |
sample_idx.release(fn=grab_sample, inputs=[sample_idx], outputs=[sample_pass, sample_code, source_embed])
|
562 |
gen_return_button.click(fn=alter_return, inputs=[sample_code, func_dropdown, pipe], outputs=[sample_code])
|
563 |
+
gen_func_button.click(fn=alter_body, inputs=[sample_code, func_dropdown, funcs, temperature, max_new_tokens, top_p, repetition_penalty, pipe], outputs=[sample_code, pipe])
|
564 |
sample_code.change(fn=list_dropdown, inputs=[sample_code], outputs=[funcs, func_dropdown]) # to update this after generation, so spans aren't messed up
|
565 |
sample_code.change(fn=make_iframe, inputs=[sample_code], outputs=[our_embed]) #twice could cause issues, find better ways.
|
566 |
site.launch()
|