Spaces:
Runtime error
Runtime error
additional model context
Browse files
app.py
CHANGED
|
@@ -269,10 +269,10 @@ outro_text ="""
|
|
| 269 |
- [] dropdown for model selection (from curated list or all supported models?)
|
| 270 |
- [] generation history stating which function and orig/generated returns. (use State ??). do it as comments in the code?
|
| 271 |
- [~] 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.
|
| 272 |
-
- [] generate whole shaders (via prompts guidance, recursive from errors)
|
| 273 |
- [x] accordion with generation parameters (as pipeline_kwargs?) look up starcoder playround and take "inspiration" from there (implemented for both buttons, untested)
|
| 274 |
- [] support FIM task for better model context
|
| 275 |
-
- [x] include some context for prompt (title, comments before a functions) - now takes all comments directly before a function as well as all comments at the beginning inside a function.
|
| 276 |
- [] gradio examples
|
| 277 |
- [] use GPU if available, respect memory restrictions.
|
| 278 |
- [x] stream model generation (maybe in a new window?) - janky solution and only sometimes hangs up
|
|
@@ -320,7 +320,7 @@ def grab_sample(sample_idx):
|
|
| 320 |
# funcs = _parse_functions(sample_code)
|
| 321 |
# func_identifiers = [f"{idx:2d}: {n.child_by_field_name('declarator').text.decode()}" for idx, n in enumerate(funcs)]
|
| 322 |
# print(f"updating drop down to:{func_identifiers}")
|
| 323 |
-
return sample_pass, sample_code, source_iframe, funcs#, gr.Dropdown.update(choices=func_identifiers) #, sample_title, sample_auhtor
|
| 324 |
|
| 325 |
|
| 326 |
def _parse_functions(in_code):
|
|
@@ -395,6 +395,10 @@ def alter_return(orig_code, func_idx, temperature, max_new_tokens, top_p, repeti
|
|
| 395 |
Args:
|
| 396 |
orig_code (str): The original code.
|
| 397 |
func_idx (int): The index of the function to replace the return statement of.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 398 |
pipeline (Pipeline): The pipeline to use for generation.
|
| 399 |
Returns:
|
| 400 |
str: The altered code.
|
|
@@ -472,22 +476,29 @@ def _get_docstrings(func_node):
|
|
| 472 |
returns the docstring of a function node
|
| 473 |
"""
|
| 474 |
docstring = ""
|
| 475 |
-
for node in func_node.child_by_field_name("body").children
|
| 476 |
-
if node.type == "comment":
|
| 477 |
docstring += node.text.decode() + "\n"
|
| 478 |
else:
|
| 479 |
return docstring
|
| 480 |
return docstring
|
| 481 |
|
| 482 |
-
def alter_body(old_code, func_id, funcs_list: list, temperature, max_new_tokens, top_p, repetition_penalty, pipeline=PIPE):
|
| 483 |
"""
|
| 484 |
Replaces the body of a function with a generated one.
|
| 485 |
Args:
|
| 486 |
old_code (str): The original code.
|
| 487 |
func_node (Node): The node of the function to replace the body of.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 488 |
pipeline (Pipeline): The pipeline to use for generation.
|
| 489 |
Returns:
|
| 490 |
str: The altered code.
|
|
|
|
| 491 |
"""
|
| 492 |
if isinstance(func_id, str):
|
| 493 |
print(f"{func_id=}")
|
|
@@ -517,8 +528,12 @@ def alter_body(old_code, func_id, funcs_list: list, temperature, max_new_tokens,
|
|
| 517 |
# second_child = func_node.child_by_field_name("body").children[1] #might error out?
|
| 518 |
docstring = _get_docstrings(func_node) #might be empty?
|
| 519 |
if docstring:
|
| 520 |
-
model_context = model_context + "\n
|
| 521 |
-
model_context = _grab_before_comments(func_node) + model_context
|
|
|
|
|
|
|
|
|
|
|
|
|
| 522 |
print(f"{model_context=}")
|
| 523 |
# generation = pipeline(model_context, return_full_text=False, **generation_kwargs)[0]["generated_text"]
|
| 524 |
generation = _run_generation(model_context, pipeline, generation_kwargs)
|
|
@@ -568,13 +583,14 @@ with gr.Blocks() as site:
|
|
| 568 |
model_cp = gr.Textbox(value="Vipitis/santacoder-finetuned-Shadertoys-fine", label="Model Checkpoint (Enter to load!)", interactive=True)
|
| 569 |
sample_idx = gr.Slider(minimum=0, maximum=num_samples, value=3211, label="pick sample from dataset", step=1.0)
|
| 570 |
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?
|
|
|
|
| 571 |
with gr.Accordion("Advanced settings", open=False): # from: https://huggingface.co/spaces/bigcode/bigcode-playground/blob/main/app.py
|
| 572 |
with gr.Row():
|
| 573 |
column_1, column_2 = gr.Column(), gr.Column()
|
| 574 |
with column_1:
|
| 575 |
temperature = gr.Slider(
|
| 576 |
label="Temperature",
|
| 577 |
-
value=0.
|
| 578 |
minimum=0.0,
|
| 579 |
maximum=1.0,
|
| 580 |
step=0.05,
|
|
@@ -583,7 +599,7 @@ with gr.Blocks() as site:
|
|
| 583 |
)
|
| 584 |
max_new_tokens = gr.Slider(
|
| 585 |
label="Max new tokens",
|
| 586 |
-
value=
|
| 587 |
minimum=0,
|
| 588 |
maximum=2048, #this could be inferred from the model?
|
| 589 |
step=32,
|
|
@@ -593,7 +609,7 @@ with gr.Blocks() as site:
|
|
| 593 |
with column_2:
|
| 594 |
top_p = gr.Slider(
|
| 595 |
label="Top-p (nucleus sampling)",
|
| 596 |
-
value=0.
|
| 597 |
minimum=0.0,
|
| 598 |
maximum=1,
|
| 599 |
step=0.05,
|
|
@@ -610,8 +626,8 @@ with gr.Blocks() as site:
|
|
| 610 |
info="Penalize repeated tokens",
|
| 611 |
)
|
| 612 |
with gr.Row():
|
| 613 |
-
gen_return_button = gr.Button("generate a alternate return statement", label="generate return")
|
| 614 |
-
gen_func_button = gr.Button("generate an alternate function body", label="generate function")
|
| 615 |
with gr.Row():
|
| 616 |
with gr.Column():
|
| 617 |
source_embed = gr.HTML('<iframe width="640" height="360" frameborder="0" src="" allowfullscreen></iframe>', label="How this shader originally renders")
|
|
@@ -627,9 +643,9 @@ with gr.Blocks() as site:
|
|
| 627 |
# history_table = gr.JSON()
|
| 628 |
|
| 629 |
model_cp.submit(fn=_make_pipeline, inputs=[model_cp], outputs=[pipe]) # how can we trigger this on load?
|
| 630 |
-
sample_idx.release(fn=grab_sample, inputs=[sample_idx], outputs=[sample_pass, sample_code, source_embed])
|
| 631 |
gen_return_button.click(fn=alter_return, inputs=[sample_code, func_dropdown, pipe], outputs=[sample_code])
|
| 632 |
-
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]).then(
|
| 633 |
fn=list_dropdown, inputs=[sample_code], outputs=[funcs, func_dropdown]
|
| 634 |
)
|
| 635 |
sample_code.change(fn=list_dropdown, inputs=[sample_code], outputs=[funcs, func_dropdown]).then(
|
|
|
|
| 269 |
- [] dropdown for model selection (from curated list or all supported models?)
|
| 270 |
- [] generation history stating which function and orig/generated returns. (use State ??). do it as comments in the code?
|
| 271 |
- [~] 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.
|
| 272 |
+
- [~] generate whole shaders (via prompts guidance, recursive from errors) - prompt context is in progress.
|
| 273 |
- [x] accordion with generation parameters (as pipeline_kwargs?) look up starcoder playround and take "inspiration" from there (implemented for both buttons, untested)
|
| 274 |
- [] support FIM task for better model context
|
| 275 |
+
- [x] include some context for prompt (title, comments before a functions) - now takes all comments directly before a function as well as all comments at the beginning inside a function. (misses comments between argument list and body)
|
| 276 |
- [] gradio examples
|
| 277 |
- [] use GPU if available, respect memory restrictions.
|
| 278 |
- [x] stream model generation (maybe in a new window?) - janky solution and only sometimes hangs up
|
|
|
|
| 320 |
# funcs = _parse_functions(sample_code)
|
| 321 |
# func_identifiers = [f"{idx:2d}: {n.child_by_field_name('declarator').text.decode()}" for idx, n in enumerate(funcs)]
|
| 322 |
# print(f"updating drop down to:{func_identifiers}")
|
| 323 |
+
return sample_pass, sample_code, sample_title, source_iframe, funcs#, gr.Dropdown.update(choices=func_identifiers) #, sample_title, sample_auhtor
|
| 324 |
|
| 325 |
|
| 326 |
def _parse_functions(in_code):
|
|
|
|
| 395 |
Args:
|
| 396 |
orig_code (str): The original code.
|
| 397 |
func_idx (int): The index of the function to replace the return statement of.
|
| 398 |
+
temperature (float): The temperature to use for generation.
|
| 399 |
+
max_new_tokens (int): The maximum number of tokens to generate.
|
| 400 |
+
top_p (float): The top_p to use for generation.
|
| 401 |
+
repetition_penalty (float): The repetition_penalty to use for generation.
|
| 402 |
pipeline (Pipeline): The pipeline to use for generation.
|
| 403 |
Returns:
|
| 404 |
str: The altered code.
|
|
|
|
| 476 |
returns the docstring of a function node
|
| 477 |
"""
|
| 478 |
docstring = ""
|
| 479 |
+
for node in func_node.child_by_field_name("body").children:
|
| 480 |
+
if node.type == "comment" or node.type == "{":
|
| 481 |
docstring += node.text.decode() + "\n"
|
| 482 |
else:
|
| 483 |
return docstring
|
| 484 |
return docstring
|
| 485 |
|
| 486 |
+
def alter_body(old_code, func_id, funcs_list: list, prompt, temperature, max_new_tokens, top_p, repetition_penalty, pipeline=PIPE):
|
| 487 |
"""
|
| 488 |
Replaces the body of a function with a generated one.
|
| 489 |
Args:
|
| 490 |
old_code (str): The original code.
|
| 491 |
func_node (Node): The node of the function to replace the body of.
|
| 492 |
+
funcs_list (list): The list of all functions in the code.
|
| 493 |
+
prompt (str): The prompt(title) to use for generation.
|
| 494 |
+
temperature (float): The temperature to use for generation.
|
| 495 |
+
max_new_tokens (int): The maximum number of tokens to generate.
|
| 496 |
+
top_p (float): The top_p to use for generation.
|
| 497 |
+
repetition_penalty (float): The repetition_penalty to use for generation.
|
| 498 |
pipeline (Pipeline): The pipeline to use for generation.
|
| 499 |
Returns:
|
| 500 |
str: The altered code.
|
| 501 |
+
pipeline (Pipeline): The pipeline to update the state
|
| 502 |
"""
|
| 503 |
if isinstance(func_id, str):
|
| 504 |
print(f"{func_id=}")
|
|
|
|
| 528 |
# second_child = func_node.child_by_field_name("body").children[1] #might error out?
|
| 529 |
docstring = _get_docstrings(func_node) #might be empty?
|
| 530 |
if docstring:
|
| 531 |
+
model_context = model_context + "\n" + docstring
|
| 532 |
+
model_context = _grab_before_comments(func_node) + model_context #prepend comments
|
| 533 |
+
if prompt != "":
|
| 534 |
+
model_context = f"//avialable functions: {','.join([n.child_by_field_name('declarator').text.decode() for n in funcs_list])}\n" + model_context #prepend available functions
|
| 535 |
+
model_context = "//Title: " + prompt + "\n" + model_context #prepend user prompt/title
|
| 536 |
+
model_context = "//Language: Shadertoy GLSL fragment shader\n" + model_context #prepend system prompt, language hint
|
| 537 |
print(f"{model_context=}")
|
| 538 |
# generation = pipeline(model_context, return_full_text=False, **generation_kwargs)[0]["generated_text"]
|
| 539 |
generation = _run_generation(model_context, pipeline, generation_kwargs)
|
|
|
|
| 583 |
model_cp = gr.Textbox(value="Vipitis/santacoder-finetuned-Shadertoys-fine", label="Model Checkpoint (Enter to load!)", interactive=True)
|
| 584 |
sample_idx = gr.Slider(minimum=0, maximum=num_samples, value=3211, label="pick sample from dataset", step=1.0)
|
| 585 |
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?
|
| 586 |
+
prompt_text = gr.Textbox(value="the title used by the model has generation hint", label="prompt text", info="leave blank to skip", interactive=True)
|
| 587 |
with gr.Accordion("Advanced settings", open=False): # from: https://huggingface.co/spaces/bigcode/bigcode-playground/blob/main/app.py
|
| 588 |
with gr.Row():
|
| 589 |
column_1, column_2 = gr.Column(), gr.Column()
|
| 590 |
with column_1:
|
| 591 |
temperature = gr.Slider(
|
| 592 |
label="Temperature",
|
| 593 |
+
value=0.2, #start out at 0 to do greedy? or will there be an error?
|
| 594 |
minimum=0.0,
|
| 595 |
maximum=1.0,
|
| 596 |
step=0.05,
|
|
|
|
| 599 |
)
|
| 600 |
max_new_tokens = gr.Slider(
|
| 601 |
label="Max new tokens",
|
| 602 |
+
value=265,
|
| 603 |
minimum=0,
|
| 604 |
maximum=2048, #this could be inferred from the model?
|
| 605 |
step=32,
|
|
|
|
| 609 |
with column_2:
|
| 610 |
top_p = gr.Slider(
|
| 611 |
label="Top-p (nucleus sampling)",
|
| 612 |
+
value=0.90,
|
| 613 |
minimum=0.0,
|
| 614 |
maximum=1,
|
| 615 |
step=0.05,
|
|
|
|
| 626 |
info="Penalize repeated tokens",
|
| 627 |
)
|
| 628 |
with gr.Row():
|
| 629 |
+
gen_return_button = gr.Button("generate a alternate return statement", label="generate return", scale=0)
|
| 630 |
+
gen_func_button = gr.Button("generate an alternate function body", label="generate function", scale=1)
|
| 631 |
with gr.Row():
|
| 632 |
with gr.Column():
|
| 633 |
source_embed = gr.HTML('<iframe width="640" height="360" frameborder="0" src="" allowfullscreen></iframe>', label="How this shader originally renders")
|
|
|
|
| 643 |
# history_table = gr.JSON()
|
| 644 |
|
| 645 |
model_cp.submit(fn=_make_pipeline, inputs=[model_cp], outputs=[pipe]) # how can we trigger this on load?
|
| 646 |
+
sample_idx.release(fn=grab_sample, inputs=[sample_idx], outputs=[sample_pass, sample_code, prompt_text, source_embed]) #funcs here?
|
| 647 |
gen_return_button.click(fn=alter_return, inputs=[sample_code, func_dropdown, pipe], outputs=[sample_code])
|
| 648 |
+
gen_func_button.click(fn=alter_body, inputs=[sample_code, func_dropdown, funcs, prompt_text, temperature, max_new_tokens, top_p, repetition_penalty, pipe], outputs=[sample_code, pipe]).then(
|
| 649 |
fn=list_dropdown, inputs=[sample_code], outputs=[funcs, func_dropdown]
|
| 650 |
)
|
| 651 |
sample_code.change(fn=list_dropdown, inputs=[sample_code], outputs=[funcs, func_dropdown]).then(
|