Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make cache support methods #1145

Open
brandonwillard opened this issue Sep 12, 2024 · 2 comments
Open

Make cache support methods #1145

brandonwillard opened this issue Sep 12, 2024 · 2 comments

Comments

@brandonwillard
Copy link
Member

brandonwillard commented Sep 12, 2024

Currently, the cache function doesn't truly support methods (see #1129). Let's consider

  • making the cache interface private/internal,
  • adding support for this (and admitting that it's a public interface/utility), or—at the very least
  • adding a warning to prevent confusion.
@brandonwillard
Copy link
Member Author

brandonwillard commented Sep 12, 2024

I noticed from the helpful test case in #1129—and the relevant vllm code—that the cache decorator is being directly applied to the function object, so we may not even be able to tell when a function is a method in order to give a warning. We might be able to handle the case of a method descriptor object, but that wouldn't have helped in the examples above.

In other words, there's probably not a general way to warn people that they could be doing something undesirable for caching. Because of that, we might want to make the caching utilities private and leave it up to the user to determine how caching should work, since all we can really guarantee is that underlying objects are serializable in a way that can work for caching.

@Quexington
Copy link

Quexington commented Dec 15, 2024

I did some research here and it seems like the reason the test case in the PR is failing is because the function being pickled for the cache has a different closure environment. The fact that store == [] for the first cache check and store == [a_1] for the second cache check means that the pickle serializations are different as indeed they should be. Consider this minimal example which does pass:

store = []

def update_store(a):
    store.append(a)

def test_get_cache_from_class_method(test_cache):
    class DummyObject:
        @classmethod
        @test_cache
        def dummy_function(cls, a):
            update_store(a)

    DummyObject.dummy_function(1)
    DummyObject.dummy_function(1)

    assert len(store) == 1

since store is not acquired via closure, the environment for both invocations of the function is the same and therefore the cache is actually hit and the side effect is prevented the second time around.

Unfortunately, I can't identify why the relevant vllm code is suffering from this since it's not using any closures. But the takeaway should be that actually cloudpickle does work for classmethods, perhaps even better than one might suppose.

If a warning is still desirable, you might want to trigger it by checking if len(cached_function.__closure__) > 0 but I'm not 100% sure a warning is warranted here since it seems like everything is being handled correctly; the cache misses seem to be intentional and good.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants