Revisit format/transform interface and implementation (datasets 4 lazy Columns)
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 35/100
Direzione di ricerca
Inizia da src/dataset.jl e dalla sezione della guida “The "julia" format and transforms” per comprendere il comportamento attuale con un singolo slot. Esegui l’harness di perf/ sia su dataset numerici sia su dataset di immagini, confrontando il formato attuale con un’alternativa basata su numpy. Il lavoro è completato quando i risultati dei benchmark sono stati registrati e utilizzati per decidere se sia giustificata un’ottimizzazione interna o un secondo asse del formato attivabile tramite opt-in.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
Revisit the format / transform interface (and its implementation) now that
datasets >= 4 returns lazy Column objects for column access. The current
behavior is intentional and documented — this issue is a placeholder to
reconsider the design, not a bug report.
Current model
A Dataset has two independent underlying slots:
- the python format
pyds._format_type(set viadatasets' own
set_format):nothing,"numpy","torch","pandas","arrow",
"polars", … - the julia
jltransformfield:py2jl,identity, or a user function.
The public API couples them into a single "format" slot (src/dataset.jl,
set_format!):
"julia"≡(_format_type = nothing, jltransform = py2jl)- any python format
X≡(_format_type = X, jltransform = identity)
So the two slots are mutually exclusive through the API: setting "julia"
resets the python format to nothing; setting a python format installs
identity. The one combination that cannot be expressed is "python format X
and py2jl on top."
What prompted this
With datasets >= 4, ds["col"] returns a lazy datasets.Column, which we now
wrap in a lazy HuggingFaceDatasets.Column <: AbstractVector (added alongside
the datasets >= 4 support). It was observed that the "julia" format calls reset_format(),
so ds.pyds["col"] is always a Column.
Worth recording: resetting to nothing is not what forces the Column. In
datasets 4, Dataset.__getitem__(str) returns a Column for every format
except arrow/pandas/polars:
| python format | ds["col"] returns |
|---|---|
nothing (our "julia") |
datasets.Column (lazy) |
"numpy" |
datasets.Column (lazy) |
"torch" |
datasets.Column (lazy) |
"pandas" |
pandas.Series (native) |
"arrow" |
pyarrow.ChunkedArray (native) |
"polars" |
polars.Series (native) |
So decoupling the two formats would not avoid Columns in general — the lazy
Column is simply the v4 default for column access.
Points to reconsider
-
One format slot vs. two independent axes. Conceptually the python format
and the julia conversion are orthogonal (whatdatasetsproduces vs. a
julia-side transform). Exposing both is more faithful but roughly doubles the
state space; most combinations are redundant (py2jlalready absorbs numpy
copylessly via DLPack) or ill-defined (py2jlhas no branch for a pandas
Series/ arrow table / torch tensor). Current stance: keep the single slot;
with_jltransform/MLUtils.mapobsare the intended composition points. -
The one real limitation — numeric throughput. Under
nothing, a numeric
batch comes back as a pythonlistandpy2jlcopies it element-by-element;
under"numpy"it would be annp.ndarray→numpy2jl(zero-copy). This is
the single case where"numpy" + py2jlgenuinely wins. -
Possible internal optimization (benchmark first). Rather than exposing a
second format knob, consider whether the"julia"format should sit on
"numpy"instead ofnothing, so numeric columns transfer copyless. Tradeoff:
image columns currently arrive asPIL.Image(→Gray/RGBImageCore
views) undernothing; under"numpy"they'd be raw transposed arrays and we
lose that clean path. Best validated with theperf/harness on both numeric
and image datasets before changing anything.
Non-goals / decision so far
- Keep the current format behavior as-is for now (intentional, documented in the
guide's "The"julia"format and transforms" section). - No API change until the numeric zero-copy question (2/3) is benchmarked and we
decide whether the win justifies either an internal base-format change or a
second, opt-in axis.
- Lingua principale
- Julia
- Stelle
- 38
- Fork
- 1
- Merge medio
- 3h 30m
- PR unite (30g)
- 20
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di JuliaGenAI/HuggingFaceDatasets.jl
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
JuliaGenAI/HuggingFaceDatasets.jl#96 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 25/100
JuliaGenAI/HuggingFaceDatasets.jl#32 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di JuliaGenAI/HuggingFaceDatasets.jl
Issue simili
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
JuliaData/DBFTables.jl#50 ·