microsoft / Trace

Trace, the New AutoDiff for AI Systems and LLM Agents
https://microsoft.github.io/Trace/
MIT License
255 stars 13 forks source link

Error with calling optimizer step method #10

Open openSourcerer9000 opened 4 hours ago

openSourcerer9000 commented 4 hours ago

Seems to be something with a funky eval call inside trace.

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[94], [line 3](vscode-notebook-cell:?execution_count=94&line=3)
      [1](vscode-notebook-cell:?execution_count=94&line=1) code_optimizer.zero_feedback()
      [2](vscode-notebook-cell:?execution_count=94&line=2) code_optimizer.backward(func, feedback, retain_graph=True)
----> [3](vscode-notebook-cell:?execution_count=94&line=3) code_optimizer.step(verbose=True)

File c:\Users\seanrm100\anaconda3\envs\fuuze\Lib\site-packages\opto\optimizers\optimizer.py:48, in Optimizer.step(self, *args, **kwargs)
     [47](file:///C:/Users/seanrm100/anaconda3/envs/fuuze/Lib/site-packages/opto/optimizers/optimizer.py:47) def step(self, *args, **kwargs):
---> [48](file:///C:/Users/seanrm100/anaconda3/envs/fuuze/Lib/site-packages/opto/optimizers/optimizer.py:48)     update_dict = self.propose(*args, **kwargs)
     [49](file:///C:/Users/seanrm100/anaconda3/envs/fuuze/Lib/site-packages/opto/optimizers/optimizer.py:49)     self.update(update_dict)

File c:\Users\seanrm100\anaconda3\envs\fuuze\Lib\site-packages\opto\optimizers\optimizer.py:53, in Optimizer.propose(self, *args, **kwargs)
     [51](file:///C:/Users/seanrm100/anaconda3/envs/fuuze/Lib/site-packages/opto/optimizers/optimizer.py:51) def propose(self, *args, **kwargs):
     [52](file:///C:/Users/seanrm100/anaconda3/envs/fuuze/Lib/site-packages/opto/optimizers/optimizer.py:52)     """Propose the new data of the parameters based on the feedback."""
---> [53](file:///C:/Users/seanrm100/anaconda3/envs/fuuze/Lib/site-packages/opto/optimizers/optimizer.py:53)     return self._step(*args, **kwargs)

File c:\Users\seanrm100\anaconda3\envs\fuuze\Lib\site-packages\opto\optimizers\optoprime.py:398, in OptoPrime._step(self, verbose, mask, *args, **kwargs)
    [395](file:///C:/Users/seanrm100/anaconda3/envs/fuuze/Lib/site-packages/opto/optimizers/optoprime.py:395)     return {}
    [397](file:///C:/Users/seanrm100/anaconda3/envs/fuuze/Lib/site-packages/opto/optimizers/optoprime.py:397) suggestion = self.extract_llm_suggestion(response)
--> [398](file:///C:/Users/seanrm100/anaconda3/envs/fuuze/Lib/site-packages/opto/optimizers/optoprime.py:398) update_dict = self.construct_update_dict(suggestion)
    [400](file:///C:/Users/seanrm100/anaconda3/envs/fuuze/Lib/site-packages/opto/optimizers/optoprime.py:400) if self.log is not None:
    [401](file:///C:/Users/seanrm100/anaconda3/envs/fuuze/Lib/site-packages/opto/optimizers/optoprime.py:401)     self.log.append({"system_prompt": system_prompt, "user_prompt": user_prompt, "response": response})

File c:\Users\seanrm100\anaconda3\envs\fuuze\Lib\site-packages\opto\optimizers\optoprime.py:413, in OptoPrime.construct_update_dict(self, suggestion)
...
    [414](file:///C:/Users/seanrm100/anaconda3/envs/fuuze/Lib/site-packages/opto/optimizers/optoprime.py:414)     except (ValueError, KeyError) as e:
    [415](file:///C:/Users/seanrm100/anaconda3/envs/fuuze/Lib/site-packages/opto/optimizers/optoprime.py:415)         # catch error due to suggestion missing the key or wrong data type
    [416](file:///C:/Users/seanrm100/anaconda3/envs/fuuze/Lib/site-packages/opto/optimizers/optoprime.py:416)         if self.ignore_extraction_error:

TypeError: function() missing required argument 'globals' (pos 2)

This is how I"m using it, with 'libname' being a local lib accessible in the current env

lib = __import__('libname')
func = getattr(lib, 'funcname')
func = node(func,trainable=True)

code_optimizer = OptoPrime([func],
                          config_list=autogen.config_list_from_json("OAI_CONFIG_LIST"),
                          ignore_extraction_error=True)

code_optimizer.zero_feedback()
code_optimizer.backward(func, 'take my feedback', retain_graph=True)
code_optimizer.step(verbose=True)
chinganc commented 2 hours ago

Hi @openSourcerer9000 , to optimize python functions, you would need to use bundle. Can you try something like?

func = bundle(trainable=True)(func)
output = func(input)
code_optimizer.backward(output, 'take my feedback')

Alternatively, if you want to use node, you would need to first convert the func into str, e.g., by using inspect.getsource.