Object/Blob store capabilities
メンテナーはふだん 4 日以内に返信
評価
この issue はまだ評価されていません。
説明
Is your feature request related to a problem? Please describe.
It is common to hold a reference to some file/large object in state. This can be, for example:
- A PDF for RAG/ingestion
- An excel document that we're generating
- A large dataframe that was pulled from S3
The problem is that this can really crowd out the state, if we JSON serialize it. E>G> a large pdf could be mbs of base-64 data each time, and as state is currently saved in its entirety after every node execution, this can get even worse.
Describe the solution you'd like
A few ideas, still thinking through:
Push to the serialization layer
This is the current approach -- we actually do this for pandas dataframes. To do this effectively, the user would be a CachingObject data type and register serialization capabilities for it. Pydantic also could do this easily.
This would look something like this -- this is an immutable reference file (E.G. one that is passed in or generated externally). Note you'd have extra steps if you were generating a file.
@dataclass
class ReferenceCachingFile:
path: str
contents_hash: str = None
contents: Optional[str] = None
def get() -> str:
if self.contents is not None:
return self.contents
self.contents = self.load()
return self.contents
def load() -> str:
with open(path, "r") as f:
contents = f.read()
# TODO -- compute + verify hash, TBD how much verification we'd want
return contents
@serde.serialize.register(ReferenceCachingFile)
def serialize_reference_caching_file(value: ReferenceCachingFile):
return {"path" value.path, "contents_hash": value.contents_hash, serde.KEY: "reference_caching_file"}
@serde.deserializer.register("reference_caching_file")
def deserialize_myclass(value: dict, myclass_kwargs: dict = None, **kwargs) -> cls:
out = ReferenceCachingFile(**value)
out.contents = out.load()
This is just an illustration -- it's missing two things:
- Generic pluggability to load from anywhere
- Saving capability as well in the case of generating files
Some options:
- Have mixins for saveable/writable with the right functions
- Keep these as part of the framework -- then just have people implement their own with a few in plugins/subclas
Push to the persistence layer
I think there's room for a o9bject_store abstraction here. Just like we have a persister, we could also have a blob store. E.G.
app = Application()
.with_state_persister(...)
.with_object_store(FileSystemStore())
...
Then the user could specify some sort of CachingFile (for lack of a better name) like we had above:
T = TypeVar("ObjectType")
class CachingFile(abc.ABC):
contents: T
contents_hash: str
location_data: dict # URI? TBD what extra data we need...
@abc.abstractmethod
def to_bytes() -> bytes:
...
@abc.abstractmethod
def from_bytes() -> T:
...
The blob store would then interact with this -- calling to_bytes/from_bytes and comparing the hash/saving at the hash location. Then the user can implement a CachingFile or use one of the plugins (pandas, pdf, etc...)... THe db would store the serialized/deserialized version, and then delegate to the blob store when rehydrating or saving state.
Some other things to flesh out:
- How to ensure we don't save it twice (the hash -- will need to put this in the interface...)
- When it would be loaded. Dynamically? On startup? Configurable?
Describe alternatives you've considered
The first one above is easiest to do now -- this is how it works, and we do something similar for pandas, a bit messy though.
Additional context
Milan J came to office hours today asking about this, thanks!
- 主要言語
- Python
- スター
- 2.6k
- フォーク
- 209
- 平均マージ
- 8日 9時間
- マージ済み PR(30日)
- 26
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
apache/burr のほかの issue
-
Notebook UI launcher should use the current Python interpreter対応中かも @sivakumar-mahalingam が 4 日前に担当しました。 オープンstatus/needs-triage
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
メンテナーはふだん 4 日以内に返信
-
astep() passes unprocessed inputs to pre_run_step hooks対応中かも @sivakumar-mahalingam が 4 日前に担当しました。 オープンstatus/needs-triage
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 4 日以内に返信
-
`burr` fails to start when the Python path has a space in it対応中かも @enekoreto が 7 日前に担当しました。 オープンstatus/needs-triage
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
メンテナーはふだん 4 日以内に返信
-
Add more instructions for applying ORM migrations for S3 deployment対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープンarea/storage area/ui help wanted kind/documentation priority/low
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
メンテナーはふだん 4 日以内に返信
-
Add documentation on how to run the Burr UI server再び着手できるかも @iamSerafinnn が 136 日前に担当しましたが、オープン中のプルリクエストはありません。 オープンarea/ui good first issue kind/documentation priority/low
難易度 2/5 半日 初心者へのやさしさ 68/100
メンテナーはふだん 4 日以内に返信
似ている issue
-
Validate non-divisible effective batch sizes in the Unsloth LoRA backend対応中かも @debesh-biswas が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
-
`rx.Model` event arguments emit `PydanticDeprecatedSince20` once per payload key対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 1/5 1時間未満 初心者へのやさしさ 88/100
reflex-dev/reflex#7634 · コメント 1 件 ·
メンテナーはふだん 2 日以内に返信
-
documentation
難易度 1/5 1〜3時間 初心者へのやさしさ 82/100
topoteretes/cognee#6239 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
ranaroussi/yfinance#3009 ·
メンテナーはふだん 1 日以内に返信
-
Test discovery aborts on GPU builds without cuStateVec: check_cuStateVec expects a failed result but set_config() now raises RuntimeError対応中かも @dmeliksetian が今日担当しました。 オープンbug
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
Qiskit/qiskit-aer#2495 ·
メンテナーはふだん 1 日以内に返信