maxframe 1.3.1__cp310-cp310-macosx_10_9_universal2.whl → 2.0.0b2__cp310-cp310-macosx_10_9_universal2.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of maxframe might be problematic. Click here for more details.
- maxframe/_utils.cpython-310-darwin.so +0 -0
- maxframe/_utils.pyi +21 -0
- maxframe/_utils.pyx +4 -3
- maxframe/codegen/__init__.py +27 -0
- maxframe/{codegen.py → codegen/core.py} +49 -43
- maxframe/codegen/spe/__init__.py +16 -0
- maxframe/codegen/spe/core.py +307 -0
- maxframe/codegen/spe/dataframe/__init__.py +37 -0
- maxframe/codegen/spe/dataframe/accessors/__init__.py +15 -0
- maxframe/codegen/spe/dataframe/accessors/base.py +53 -0
- maxframe/codegen/spe/dataframe/accessors/dict_.py +194 -0
- maxframe/codegen/spe/dataframe/accessors/list_.py +80 -0
- maxframe/codegen/spe/dataframe/arithmetic.py +84 -0
- maxframe/codegen/spe/dataframe/datasource.py +181 -0
- maxframe/codegen/spe/dataframe/datastore.py +204 -0
- maxframe/codegen/spe/dataframe/extensions.py +63 -0
- maxframe/codegen/spe/dataframe/fetch.py +26 -0
- maxframe/codegen/spe/dataframe/groupby.py +224 -0
- maxframe/codegen/spe/dataframe/indexing.py +238 -0
- maxframe/codegen/spe/dataframe/merge.py +73 -0
- maxframe/codegen/spe/dataframe/misc.py +286 -0
- maxframe/codegen/spe/dataframe/missing.py +64 -0
- maxframe/codegen/spe/dataframe/reduction.py +160 -0
- maxframe/codegen/spe/dataframe/sort.py +83 -0
- maxframe/codegen/spe/dataframe/statistics.py +46 -0
- maxframe/codegen/spe/dataframe/tests/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/accessors/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/accessors/test_base.py +33 -0
- maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +310 -0
- maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +137 -0
- maxframe/codegen/spe/dataframe/tests/indexing/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/indexing/conftest.py +58 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_getitem.py +124 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +76 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_indexing.py +39 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_rename.py +51 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_reset_index.py +88 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_sample.py +45 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_set_axis.py +45 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_set_index.py +41 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_setitem.py +46 -0
- maxframe/codegen/spe/dataframe/tests/misc/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_apply.py +133 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_drop_duplicates.py +92 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +234 -0
- maxframe/codegen/spe/dataframe/tests/missing/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_checkna.py +94 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_dropna.py +50 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_fillna.py +94 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_replace.py +45 -0
- maxframe/codegen/spe/dataframe/tests/test_arithmetic.py +73 -0
- maxframe/codegen/spe/dataframe/tests/test_datasource.py +184 -0
- maxframe/codegen/spe/dataframe/tests/test_datastore.py +200 -0
- maxframe/codegen/spe/dataframe/tests/test_extensions.py +88 -0
- maxframe/codegen/spe/dataframe/tests/test_groupby.py +225 -0
- maxframe/codegen/spe/dataframe/tests/test_merge.py +400 -0
- maxframe/codegen/spe/dataframe/tests/test_reduction.py +104 -0
- maxframe/codegen/spe/dataframe/tests/test_sort.py +159 -0
- maxframe/codegen/spe/dataframe/tests/test_statistics.py +70 -0
- maxframe/codegen/spe/dataframe/tests/test_tseries.py +29 -0
- maxframe/codegen/spe/dataframe/tests/test_value_counts.py +60 -0
- maxframe/codegen/spe/dataframe/tests/test_window.py +69 -0
- maxframe/codegen/spe/dataframe/tseries.py +46 -0
- maxframe/codegen/spe/dataframe/udf.py +62 -0
- maxframe/codegen/spe/dataframe/value_counts.py +31 -0
- maxframe/codegen/spe/dataframe/window.py +65 -0
- maxframe/codegen/spe/learn/__init__.py +15 -0
- maxframe/codegen/spe/learn/contrib/__init__.py +15 -0
- maxframe/codegen/spe/learn/contrib/lightgbm.py +160 -0
- maxframe/codegen/spe/learn/contrib/models.py +41 -0
- maxframe/codegen/spe/learn/contrib/pytorch.py +49 -0
- maxframe/codegen/spe/learn/contrib/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/contrib/tests/test_lightgbm.py +123 -0
- maxframe/codegen/spe/learn/contrib/tests/test_models.py +41 -0
- maxframe/codegen/spe/learn/contrib/tests/test_pytorch.py +53 -0
- maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +98 -0
- maxframe/codegen/spe/learn/contrib/xgboost.py +152 -0
- maxframe/codegen/spe/learn/metrics/__init__.py +15 -0
- maxframe/codegen/spe/learn/metrics/_classification.py +120 -0
- maxframe/codegen/spe/learn/metrics/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/metrics/tests/test_classification.py +93 -0
- maxframe/codegen/spe/learn/model_selection/__init__.py +13 -0
- maxframe/codegen/spe/learn/model_selection/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/model_selection/tests/test_split.py +41 -0
- maxframe/codegen/spe/learn/preprocessing/__init__.py +15 -0
- maxframe/codegen/spe/learn/preprocessing/_data.py +37 -0
- maxframe/codegen/spe/learn/preprocessing/_label.py +47 -0
- maxframe/codegen/spe/learn/preprocessing/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/preprocessing/tests/test_data.py +31 -0
- maxframe/codegen/spe/learn/preprocessing/tests/test_label.py +43 -0
- maxframe/codegen/spe/learn/utils/__init__.py +15 -0
- maxframe/codegen/spe/learn/utils/checks.py +55 -0
- maxframe/codegen/spe/learn/utils/multiclass.py +60 -0
- maxframe/codegen/spe/learn/utils/shuffle.py +85 -0
- maxframe/codegen/spe/learn/utils/sparsefuncs.py +35 -0
- maxframe/codegen/spe/learn/utils/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/utils/tests/test_checks.py +48 -0
- maxframe/codegen/spe/learn/utils/tests/test_multiclass.py +52 -0
- maxframe/codegen/spe/learn/utils/tests/test_shuffle.py +50 -0
- maxframe/codegen/spe/learn/utils/tests/test_sparsefuncs.py +34 -0
- maxframe/codegen/spe/learn/utils/tests/test_validation.py +44 -0
- maxframe/codegen/spe/learn/utils/validation.py +35 -0
- maxframe/codegen/spe/objects.py +26 -0
- maxframe/codegen/spe/remote.py +29 -0
- maxframe/codegen/spe/tensor/__init__.py +28 -0
- maxframe/codegen/spe/tensor/arithmetic.py +95 -0
- maxframe/codegen/spe/tensor/core.py +41 -0
- maxframe/codegen/spe/tensor/datasource.py +165 -0
- maxframe/codegen/spe/tensor/extensions.py +35 -0
- maxframe/codegen/spe/tensor/fetch.py +26 -0
- maxframe/codegen/spe/tensor/indexing.py +63 -0
- maxframe/codegen/spe/tensor/linalg.py +63 -0
- maxframe/codegen/spe/tensor/merge.py +31 -0
- maxframe/codegen/spe/tensor/misc.py +121 -0
- maxframe/codegen/spe/tensor/random.py +29 -0
- maxframe/codegen/spe/tensor/reduction.py +39 -0
- maxframe/codegen/spe/tensor/reshape.py +26 -0
- maxframe/codegen/spe/tensor/sort.py +42 -0
- maxframe/codegen/spe/tensor/special.py +35 -0
- maxframe/codegen/spe/tensor/statistics.py +24 -0
- maxframe/codegen/spe/tensor/tests/__init__.py +13 -0
- maxframe/codegen/spe/tensor/tests/test_arithmetic.py +103 -0
- maxframe/codegen/spe/tensor/tests/test_datasource.py +99 -0
- maxframe/codegen/spe/tensor/tests/test_extensions.py +37 -0
- maxframe/codegen/spe/tensor/tests/test_indexing.py +44 -0
- maxframe/codegen/spe/tensor/tests/test_linalg.py +38 -0
- maxframe/codegen/spe/tensor/tests/test_merge.py +28 -0
- maxframe/codegen/spe/tensor/tests/test_misc.py +94 -0
- maxframe/codegen/spe/tensor/tests/test_random.py +55 -0
- maxframe/codegen/spe/tensor/tests/test_reduction.py +65 -0
- maxframe/codegen/spe/tensor/tests/test_reshape.py +39 -0
- maxframe/codegen/spe/tensor/tests/test_sort.py +49 -0
- maxframe/codegen/spe/tensor/tests/test_special.py +28 -0
- maxframe/codegen/spe/tensor/tests/test_statistics.py +29 -0
- maxframe/codegen/spe/tests/__init__.py +13 -0
- maxframe/codegen/spe/tests/test_remote.py +29 -0
- maxframe/codegen/spe/tests/test_spe_codegen.py +141 -0
- maxframe/codegen/spe/utils.py +54 -0
- maxframe/codegen/tests/__init__.py +13 -0
- maxframe/{tests → codegen/tests}/test_codegen.py +3 -5
- maxframe/config/__init__.py +1 -1
- maxframe/config/config.py +50 -23
- maxframe/config/tests/test_config.py +4 -12
- maxframe/config/validators.py +5 -0
- maxframe/conftest.py +38 -10
- maxframe/core/__init__.py +1 -0
- maxframe/core/context.py +110 -0
- maxframe/core/entity/__init__.py +1 -0
- maxframe/core/entity/core.py +0 -7
- maxframe/core/entity/objects.py +19 -5
- maxframe/core/entity/output_types.py +11 -0
- maxframe/core/entity/tests/test_objects.py +11 -12
- maxframe/core/entity/tileables.py +3 -1
- maxframe/core/entity/utils.py +15 -0
- maxframe/core/graph/__init__.py +6 -1
- maxframe/core/graph/builder/base.py +5 -1
- maxframe/core/graph/core.cpython-310-darwin.so +0 -0
- maxframe/core/graph/core.pyx +17 -6
- maxframe/core/graph/entity.py +18 -6
- maxframe/core/operator/__init__.py +8 -3
- maxframe/core/operator/base.py +35 -12
- maxframe/core/operator/core.py +37 -14
- maxframe/core/operator/fetch.py +5 -18
- maxframe/core/operator/objects.py +0 -20
- maxframe/core/operator/shuffle.py +6 -72
- maxframe/dataframe/__init__.py +1 -0
- maxframe/dataframe/accessors/datetime_/core.py +7 -4
- maxframe/dataframe/accessors/string_/core.py +9 -6
- maxframe/dataframe/arithmetic/core.py +31 -20
- maxframe/dataframe/arithmetic/tests/test_arithmetic.py +6 -0
- maxframe/dataframe/core.py +98 -91
- maxframe/dataframe/datasource/core.py +8 -1
- maxframe/dataframe/datasource/date_range.py +8 -0
- maxframe/dataframe/datasource/from_index.py +9 -5
- maxframe/dataframe/datasource/from_records.py +9 -2
- maxframe/dataframe/datasource/from_tensor.py +32 -21
- maxframe/dataframe/datasource/read_csv.py +8 -2
- maxframe/dataframe/datasource/read_odps_query.py +109 -19
- maxframe/dataframe/datasource/read_odps_table.py +20 -5
- maxframe/dataframe/datasource/read_parquet.py +8 -3
- maxframe/dataframe/datasource/tests/test_datasource.py +80 -1
- maxframe/dataframe/datastore/tests/test_to_odps.py +52 -1
- maxframe/dataframe/datastore/to_csv.py +7 -3
- maxframe/dataframe/datastore/to_odps.py +42 -6
- maxframe/dataframe/extensions/__init__.py +6 -1
- maxframe/dataframe/extensions/apply_chunk.py +96 -136
- maxframe/dataframe/extensions/flatjson.py +3 -2
- maxframe/dataframe/extensions/flatmap.py +15 -7
- maxframe/dataframe/fetch/core.py +12 -1
- maxframe/dataframe/groupby/__init__.py +7 -0
- maxframe/dataframe/groupby/aggregation.py +9 -8
- maxframe/dataframe/groupby/apply.py +50 -74
- maxframe/dataframe/groupby/apply_chunk.py +393 -0
- maxframe/dataframe/groupby/core.py +80 -17
- maxframe/dataframe/groupby/extensions.py +26 -0
- maxframe/dataframe/groupby/fill.py +9 -4
- maxframe/dataframe/groupby/sample.py +7 -7
- maxframe/dataframe/groupby/tests/test_groupby.py +3 -3
- maxframe/dataframe/groupby/transform.py +57 -54
- maxframe/dataframe/indexing/align.py +7 -6
- maxframe/dataframe/indexing/getitem.py +9 -8
- maxframe/dataframe/indexing/iloc.py +28 -23
- maxframe/dataframe/indexing/insert.py +7 -3
- maxframe/dataframe/indexing/loc.py +9 -8
- maxframe/dataframe/indexing/reindex.py +36 -30
- maxframe/dataframe/indexing/rename_axis.py +18 -10
- maxframe/dataframe/indexing/reset_index.py +0 -2
- maxframe/dataframe/indexing/sample.py +13 -9
- maxframe/dataframe/indexing/set_axis.py +9 -6
- maxframe/dataframe/indexing/setitem.py +8 -5
- maxframe/dataframe/indexing/where.py +12 -9
- maxframe/dataframe/merge/__init__.py +0 -1
- maxframe/dataframe/merge/concat.py +10 -31
- maxframe/dataframe/merge/merge.py +2 -24
- maxframe/dataframe/misc/__init__.py +6 -0
- maxframe/dataframe/misc/_duplicate.py +7 -3
- maxframe/dataframe/misc/apply.py +106 -139
- maxframe/dataframe/misc/astype.py +3 -2
- maxframe/dataframe/misc/case_when.py +11 -7
- maxframe/dataframe/misc/cut.py +11 -10
- maxframe/dataframe/misc/describe.py +7 -3
- maxframe/dataframe/misc/drop.py +13 -11
- maxframe/dataframe/misc/eval.py +0 -2
- maxframe/dataframe/misc/get_dummies.py +78 -49
- maxframe/dataframe/misc/isin.py +13 -10
- maxframe/dataframe/misc/map.py +21 -6
- maxframe/dataframe/misc/melt.py +8 -1
- maxframe/dataframe/misc/pivot.py +232 -0
- maxframe/dataframe/misc/pivot_table.py +52 -40
- maxframe/dataframe/misc/rechunk.py +59 -0
- maxframe/dataframe/misc/shift.py +7 -4
- maxframe/dataframe/misc/stack.py +5 -3
- maxframe/dataframe/misc/tests/test_misc.py +167 -1
- maxframe/dataframe/misc/transform.py +63 -65
- maxframe/dataframe/misc/value_counts.py +7 -4
- maxframe/dataframe/missing/dropna.py +16 -7
- maxframe/dataframe/missing/fillna.py +18 -10
- maxframe/dataframe/missing/replace.py +10 -6
- maxframe/dataframe/missing/tests/test_missing.py +2 -2
- maxframe/dataframe/operators.py +1 -27
- maxframe/dataframe/reduction/aggregation.py +65 -3
- maxframe/dataframe/reduction/core.py +3 -1
- maxframe/dataframe/reduction/median.py +1 -1
- maxframe/dataframe/reduction/tests/test_reduction.py +33 -0
- maxframe/dataframe/reduction/unique.py +53 -7
- maxframe/dataframe/statistics/corr.py +9 -6
- maxframe/dataframe/statistics/quantile.py +9 -6
- maxframe/dataframe/tseries/to_datetime.py +6 -4
- maxframe/dataframe/utils.py +219 -31
- maxframe/dataframe/window/rolling.py +7 -4
- maxframe/env.py +1 -0
- maxframe/errors.py +9 -0
- maxframe/extension.py +13 -2
- maxframe/io/objects/core.py +67 -51
- maxframe/io/objects/tensor.py +73 -17
- maxframe/io/objects/tests/test_object_io.py +10 -55
- maxframe/io/odpsio/arrow.py +15 -2
- maxframe/io/odpsio/schema.py +43 -13
- maxframe/io/odpsio/tableio.py +63 -11
- maxframe/io/odpsio/tests/test_arrow.py +1 -2
- maxframe/io/odpsio/tests/test_schema.py +114 -1
- maxframe/io/odpsio/tests/test_tableio.py +42 -0
- maxframe/io/odpsio/tests/test_volumeio.py +21 -58
- maxframe/io/odpsio/volumeio.py +23 -8
- maxframe/learn/__init__.py +2 -2
- maxframe/learn/contrib/__init__.py +2 -2
- maxframe/learn/contrib/graph/connected_components.py +2 -1
- maxframe/learn/contrib/lightgbm/__init__.py +33 -0
- maxframe/learn/contrib/lightgbm/_predict.py +138 -0
- maxframe/learn/contrib/lightgbm/_train.py +163 -0
- maxframe/learn/contrib/lightgbm/callback.py +114 -0
- maxframe/learn/contrib/lightgbm/classifier.py +199 -0
- maxframe/learn/contrib/lightgbm/core.py +372 -0
- maxframe/learn/contrib/lightgbm/dataset.py +153 -0
- maxframe/learn/contrib/lightgbm/regressor.py +29 -0
- maxframe/learn/contrib/lightgbm/tests/__init__.py +13 -0
- maxframe/learn/contrib/lightgbm/tests/test_callback.py +58 -0
- maxframe/learn/contrib/models.py +38 -9
- maxframe/learn/contrib/utils.py +55 -0
- maxframe/learn/contrib/xgboost/callback.py +86 -0
- maxframe/learn/contrib/xgboost/classifier.py +26 -30
- maxframe/learn/contrib/xgboost/core.py +54 -42
- maxframe/learn/contrib/xgboost/dmatrix.py +19 -12
- maxframe/learn/contrib/xgboost/predict.py +16 -9
- maxframe/learn/contrib/xgboost/regressor.py +28 -27
- maxframe/learn/contrib/xgboost/tests/test_callback.py +41 -0
- maxframe/learn/contrib/xgboost/train.py +59 -16
- maxframe/learn/core.py +252 -0
- maxframe/learn/datasets/__init__.py +20 -0
- maxframe/learn/datasets/samples_generator.py +628 -0
- maxframe/learn/linear_model/__init__.py +15 -0
- maxframe/learn/linear_model/_base.py +163 -0
- maxframe/learn/linear_model/_lin_reg.py +175 -0
- maxframe/learn/metrics/__init__.py +25 -0
- maxframe/learn/metrics/_check_targets.py +95 -0
- maxframe/learn/metrics/_classification.py +1121 -0
- maxframe/learn/metrics/_regression.py +256 -0
- maxframe/learn/model_selection/__init__.py +15 -0
- maxframe/learn/model_selection/_split.py +451 -0
- maxframe/learn/model_selection/tests/__init__.py +13 -0
- maxframe/learn/model_selection/tests/test_split.py +156 -0
- maxframe/learn/preprocessing/__init__.py +16 -0
- maxframe/learn/preprocessing/_data/__init__.py +17 -0
- maxframe/learn/preprocessing/_data/min_max_scaler.py +390 -0
- maxframe/learn/preprocessing/_data/normalize.py +127 -0
- maxframe/learn/preprocessing/_data/standard_scaler.py +503 -0
- maxframe/learn/preprocessing/_data/utils.py +79 -0
- maxframe/learn/preprocessing/_label/__init__.py +16 -0
- maxframe/learn/preprocessing/_label/_label_binarizer.py +599 -0
- maxframe/learn/preprocessing/_label/_label_encoder.py +174 -0
- maxframe/learn/utils/__init__.py +4 -0
- maxframe/learn/utils/_encode.py +314 -0
- maxframe/learn/utils/checks.py +161 -0
- maxframe/learn/utils/core.py +33 -0
- maxframe/learn/utils/extmath.py +176 -0
- maxframe/learn/utils/multiclass.py +292 -0
- maxframe/learn/utils/shuffle.py +114 -0
- maxframe/learn/utils/sparsefuncs.py +87 -0
- maxframe/learn/utils/validation.py +775 -0
- maxframe/lib/__init__.py +0 -2
- maxframe/lib/compat.py +145 -0
- maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
- maxframe/lib/mmh3.cpython-310-darwin.so +0 -0
- maxframe/lib/sparse/__init__.py +10 -15
- maxframe/lib/sparse/array.py +45 -33
- maxframe/lib/sparse/core.py +0 -2
- maxframe/lib/sparse/linalg.py +31 -0
- maxframe/lib/sparse/matrix.py +5 -2
- maxframe/lib/sparse/tests/__init__.py +0 -2
- maxframe/lib/sparse/tests/test_sparse.py +53 -53
- maxframe/lib/sparse/vector.py +0 -2
- maxframe/mixin.py +59 -2
- maxframe/opcodes.py +13 -5
- maxframe/protocol.py +67 -14
- maxframe/remote/core.py +16 -14
- maxframe/remote/run_script.py +6 -3
- maxframe/serialization/__init__.py +2 -0
- maxframe/serialization/core.cpython-310-darwin.so +0 -0
- maxframe/serialization/core.pxd +3 -0
- maxframe/serialization/core.pyi +3 -1
- maxframe/serialization/core.pyx +82 -4
- maxframe/serialization/pandas.py +5 -1
- maxframe/serialization/serializables/core.py +6 -5
- maxframe/serialization/serializables/field.py +2 -2
- maxframe/serialization/serializables/tests/test_field_type.py +3 -5
- maxframe/serialization/tests/test_serial.py +27 -0
- maxframe/session.py +4 -71
- maxframe/sperunner.py +165 -0
- maxframe/tensor/__init__.py +35 -2
- maxframe/tensor/arithmetic/__init__.py +2 -4
- maxframe/tensor/arithmetic/abs.py +0 -2
- maxframe/tensor/arithmetic/absolute.py +0 -2
- maxframe/tensor/arithmetic/add.py +34 -4
- maxframe/tensor/arithmetic/angle.py +0 -2
- maxframe/tensor/arithmetic/arccos.py +1 -4
- maxframe/tensor/arithmetic/arccosh.py +1 -3
- maxframe/tensor/arithmetic/arcsin.py +0 -2
- maxframe/tensor/arithmetic/arcsinh.py +0 -2
- maxframe/tensor/arithmetic/arctan.py +0 -2
- maxframe/tensor/arithmetic/arctan2.py +0 -2
- maxframe/tensor/arithmetic/arctanh.py +0 -2
- maxframe/tensor/arithmetic/around.py +0 -2
- maxframe/tensor/arithmetic/bitand.py +0 -2
- maxframe/tensor/arithmetic/bitor.py +1 -3
- maxframe/tensor/arithmetic/bitxor.py +1 -3
- maxframe/tensor/arithmetic/cbrt.py +0 -2
- maxframe/tensor/arithmetic/ceil.py +0 -2
- maxframe/tensor/arithmetic/clip.py +13 -13
- maxframe/tensor/arithmetic/conj.py +0 -2
- maxframe/tensor/arithmetic/copysign.py +0 -2
- maxframe/tensor/arithmetic/core.py +47 -39
- maxframe/tensor/arithmetic/cos.py +1 -3
- maxframe/tensor/arithmetic/cosh.py +0 -2
- maxframe/tensor/arithmetic/deg2rad.py +0 -2
- maxframe/tensor/arithmetic/degrees.py +0 -2
- maxframe/tensor/arithmetic/divide.py +0 -2
- maxframe/tensor/arithmetic/equal.py +0 -2
- maxframe/tensor/arithmetic/exp.py +1 -3
- maxframe/tensor/arithmetic/exp2.py +0 -2
- maxframe/tensor/arithmetic/expm1.py +0 -2
- maxframe/tensor/arithmetic/fabs.py +0 -2
- maxframe/tensor/arithmetic/fix.py +0 -2
- maxframe/tensor/arithmetic/float_power.py +0 -2
- maxframe/tensor/arithmetic/floor.py +0 -2
- maxframe/tensor/arithmetic/floordiv.py +0 -2
- maxframe/tensor/arithmetic/fmax.py +0 -2
- maxframe/tensor/arithmetic/fmin.py +0 -2
- maxframe/tensor/arithmetic/fmod.py +0 -2
- maxframe/tensor/arithmetic/frexp.py +6 -2
- maxframe/tensor/arithmetic/greater.py +0 -2
- maxframe/tensor/arithmetic/greater_equal.py +0 -2
- maxframe/tensor/arithmetic/hypot.py +0 -2
- maxframe/tensor/arithmetic/i0.py +1 -3
- maxframe/tensor/arithmetic/imag.py +0 -2
- maxframe/tensor/arithmetic/invert.py +1 -3
- maxframe/tensor/arithmetic/isclose.py +0 -2
- maxframe/tensor/arithmetic/iscomplex.py +0 -2
- maxframe/tensor/arithmetic/isfinite.py +1 -3
- maxframe/tensor/arithmetic/isinf.py +0 -2
- maxframe/tensor/arithmetic/isnan.py +0 -2
- maxframe/tensor/arithmetic/isreal.py +0 -2
- maxframe/tensor/arithmetic/ldexp.py +0 -2
- maxframe/tensor/arithmetic/less.py +0 -2
- maxframe/tensor/arithmetic/less_equal.py +0 -2
- maxframe/tensor/arithmetic/log.py +1 -3
- maxframe/tensor/arithmetic/log10.py +1 -3
- maxframe/tensor/arithmetic/log1p.py +1 -3
- maxframe/tensor/arithmetic/log2.py +1 -3
- maxframe/tensor/arithmetic/logaddexp.py +0 -2
- maxframe/tensor/arithmetic/logaddexp2.py +0 -2
- maxframe/tensor/arithmetic/logical_and.py +0 -2
- maxframe/tensor/arithmetic/logical_not.py +1 -3
- maxframe/tensor/arithmetic/logical_or.py +0 -2
- maxframe/tensor/arithmetic/logical_xor.py +0 -2
- maxframe/tensor/arithmetic/lshift.py +0 -2
- maxframe/tensor/arithmetic/maximum.py +0 -2
- maxframe/tensor/arithmetic/minimum.py +0 -2
- maxframe/tensor/arithmetic/mod.py +0 -2
- maxframe/tensor/arithmetic/modf.py +6 -2
- maxframe/tensor/arithmetic/multiply.py +37 -4
- maxframe/tensor/arithmetic/nan_to_num.py +0 -2
- maxframe/tensor/arithmetic/negative.py +0 -2
- maxframe/tensor/arithmetic/nextafter.py +0 -2
- maxframe/tensor/arithmetic/not_equal.py +0 -2
- maxframe/tensor/arithmetic/positive.py +0 -2
- maxframe/tensor/arithmetic/power.py +0 -2
- maxframe/tensor/arithmetic/rad2deg.py +0 -2
- maxframe/tensor/arithmetic/radians.py +0 -2
- maxframe/tensor/arithmetic/real.py +0 -2
- maxframe/tensor/arithmetic/reciprocal.py +5 -3
- maxframe/tensor/arithmetic/rint.py +1 -3
- maxframe/tensor/arithmetic/rshift.py +0 -2
- maxframe/tensor/arithmetic/setimag.py +0 -2
- maxframe/tensor/arithmetic/setreal.py +0 -2
- maxframe/tensor/arithmetic/sign.py +0 -2
- maxframe/tensor/arithmetic/signbit.py +0 -2
- maxframe/tensor/arithmetic/sin.py +0 -2
- maxframe/tensor/arithmetic/sinc.py +1 -3
- maxframe/tensor/arithmetic/sinh.py +0 -2
- maxframe/tensor/arithmetic/spacing.py +0 -2
- maxframe/tensor/arithmetic/sqrt.py +0 -2
- maxframe/tensor/arithmetic/square.py +0 -2
- maxframe/tensor/arithmetic/subtract.py +4 -2
- maxframe/tensor/arithmetic/tan.py +0 -2
- maxframe/tensor/arithmetic/tanh.py +0 -2
- maxframe/tensor/arithmetic/tests/__init__.py +0 -2
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +43 -9
- maxframe/tensor/arithmetic/truediv.py +0 -2
- maxframe/tensor/arithmetic/trunc.py +0 -2
- maxframe/tensor/arithmetic/utils.py +32 -6
- maxframe/tensor/array_utils.py +3 -25
- maxframe/tensor/core.py +6 -6
- maxframe/tensor/datasource/__init__.py +10 -2
- maxframe/tensor/datasource/arange.py +0 -2
- maxframe/tensor/datasource/array.py +3 -22
- maxframe/tensor/datasource/core.py +15 -10
- maxframe/tensor/datasource/diag.py +140 -0
- maxframe/tensor/datasource/diagflat.py +69 -0
- maxframe/tensor/datasource/empty.py +0 -2
- maxframe/tensor/datasource/eye.py +95 -0
- maxframe/tensor/datasource/from_dataframe.py +0 -2
- maxframe/tensor/datasource/from_dense.py +0 -17
- maxframe/tensor/datasource/from_sparse.py +0 -2
- maxframe/tensor/datasource/full.py +0 -2
- maxframe/tensor/datasource/identity.py +54 -0
- maxframe/tensor/datasource/indices.py +115 -0
- maxframe/tensor/datasource/linspace.py +140 -0
- maxframe/tensor/datasource/meshgrid.py +135 -0
- maxframe/tensor/datasource/ones.py +8 -3
- maxframe/tensor/datasource/tests/test_datasource.py +32 -1
- maxframe/tensor/datasource/tri_array.py +107 -0
- maxframe/tensor/datasource/zeros.py +7 -3
- maxframe/tensor/extensions/__init__.py +31 -0
- maxframe/tensor/extensions/accessor.py +25 -0
- maxframe/tensor/extensions/apply_chunk.py +137 -0
- maxframe/tensor/indexing/__init__.py +1 -1
- maxframe/tensor/indexing/choose.py +8 -6
- maxframe/tensor/indexing/compress.py +0 -2
- maxframe/tensor/indexing/extract.py +0 -2
- maxframe/tensor/indexing/fill_diagonal.py +9 -6
- maxframe/tensor/indexing/flatnonzero.py +1 -3
- maxframe/tensor/indexing/getitem.py +10 -43
- maxframe/tensor/indexing/nonzero.py +2 -4
- maxframe/tensor/indexing/setitem.py +19 -9
- maxframe/tensor/indexing/slice.py +6 -3
- maxframe/tensor/indexing/take.py +0 -2
- maxframe/tensor/indexing/tests/__init__.py +0 -2
- maxframe/tensor/indexing/tests/test_indexing.py +0 -2
- maxframe/tensor/indexing/unravel_index.py +6 -6
- maxframe/tensor/lib/__init__.py +16 -0
- maxframe/tensor/lib/index_tricks.py +404 -0
- maxframe/tensor/linalg/__init__.py +36 -0
- maxframe/tensor/linalg/dot.py +145 -0
- maxframe/tensor/linalg/inner.py +36 -0
- maxframe/tensor/linalg/inv.py +83 -0
- maxframe/tensor/linalg/lu.py +115 -0
- maxframe/tensor/linalg/matmul.py +225 -0
- maxframe/tensor/linalg/qr.py +124 -0
- maxframe/tensor/linalg/solve_triangular.py +103 -0
- maxframe/tensor/linalg/svd.py +167 -0
- maxframe/tensor/linalg/tensordot.py +213 -0
- maxframe/tensor/linalg/vdot.py +73 -0
- maxframe/tensor/merge/__init__.py +4 -0
- maxframe/tensor/merge/append.py +74 -0
- maxframe/tensor/merge/column_stack.py +63 -0
- maxframe/tensor/merge/concatenate.py +3 -2
- maxframe/tensor/merge/dstack.py +71 -0
- maxframe/tensor/merge/hstack.py +70 -0
- maxframe/tensor/merge/stack.py +0 -2
- maxframe/tensor/merge/tests/test_merge.py +0 -2
- maxframe/tensor/misc/__init__.py +18 -5
- maxframe/tensor/misc/astype.py +10 -8
- maxframe/tensor/misc/broadcast_to.py +1 -1
- maxframe/tensor/misc/copy.py +64 -0
- maxframe/tensor/misc/diff.py +115 -0
- maxframe/tensor/misc/flatten.py +63 -0
- maxframe/tensor/misc/in1d.py +94 -0
- maxframe/tensor/misc/isin.py +130 -0
- maxframe/tensor/misc/ndim.py +53 -0
- maxframe/tensor/misc/ravel.py +0 -2
- maxframe/tensor/misc/repeat.py +129 -0
- maxframe/tensor/misc/searchsorted.py +147 -0
- maxframe/tensor/misc/setdiff1d.py +58 -0
- maxframe/tensor/misc/squeeze.py +117 -0
- maxframe/tensor/misc/swapaxes.py +113 -0
- maxframe/tensor/misc/tests/test_misc.py +0 -2
- maxframe/tensor/misc/transpose.py +8 -4
- maxframe/tensor/misc/trapezoid.py +123 -0
- maxframe/tensor/misc/unique.py +0 -1
- maxframe/tensor/misc/where.py +10 -8
- maxframe/tensor/operators.py +0 -34
- maxframe/tensor/random/__init__.py +3 -5
- maxframe/tensor/random/binomial.py +0 -2
- maxframe/tensor/random/bytes.py +0 -2
- maxframe/tensor/random/chisquare.py +0 -2
- maxframe/tensor/random/choice.py +9 -8
- maxframe/tensor/random/core.py +20 -5
- maxframe/tensor/random/dirichlet.py +0 -2
- maxframe/tensor/random/exponential.py +0 -2
- maxframe/tensor/random/f.py +2 -4
- maxframe/tensor/random/gamma.py +0 -2
- maxframe/tensor/random/geometric.py +0 -2
- maxframe/tensor/random/gumbel.py +0 -2
- maxframe/tensor/random/hypergeometric.py +0 -2
- maxframe/tensor/random/laplace.py +2 -4
- maxframe/tensor/random/logistic.py +0 -2
- maxframe/tensor/random/lognormal.py +0 -2
- maxframe/tensor/random/logseries.py +0 -2
- maxframe/tensor/random/multinomial.py +0 -2
- maxframe/tensor/random/multivariate_normal.py +0 -2
- maxframe/tensor/random/negative_binomial.py +0 -2
- maxframe/tensor/random/noncentral_chisquare.py +0 -2
- maxframe/tensor/random/noncentral_f.py +1 -3
- maxframe/tensor/random/normal.py +0 -2
- maxframe/tensor/random/pareto.py +0 -2
- maxframe/tensor/random/permutation.py +6 -3
- maxframe/tensor/random/poisson.py +0 -2
- maxframe/tensor/random/power.py +0 -2
- maxframe/tensor/random/rand.py +0 -2
- maxframe/tensor/random/randint.py +0 -2
- maxframe/tensor/random/randn.py +0 -2
- maxframe/tensor/random/random_integers.py +0 -2
- maxframe/tensor/random/random_sample.py +0 -2
- maxframe/tensor/random/rayleigh.py +0 -2
- maxframe/tensor/random/standard_cauchy.py +0 -2
- maxframe/tensor/random/standard_exponential.py +0 -2
- maxframe/tensor/random/standard_gamma.py +0 -2
- maxframe/tensor/random/standard_normal.py +0 -2
- maxframe/tensor/random/standard_t.py +0 -2
- maxframe/tensor/random/tests/__init__.py +0 -2
- maxframe/tensor/random/tests/test_random.py +0 -2
- maxframe/tensor/random/triangular.py +0 -2
- maxframe/tensor/random/uniform.py +0 -2
- maxframe/tensor/random/vonmises.py +0 -2
- maxframe/tensor/random/wald.py +0 -2
- maxframe/tensor/random/weibull.py +0 -2
- maxframe/tensor/random/zipf.py +0 -2
- maxframe/tensor/reduction/__init__.py +0 -2
- maxframe/tensor/reduction/all.py +0 -2
- maxframe/tensor/reduction/allclose.py +0 -2
- maxframe/tensor/reduction/any.py +0 -2
- maxframe/tensor/reduction/argmax.py +1 -3
- maxframe/tensor/reduction/argmin.py +1 -3
- maxframe/tensor/reduction/array_equal.py +0 -2
- maxframe/tensor/reduction/core.py +0 -2
- maxframe/tensor/reduction/count_nonzero.py +0 -2
- maxframe/tensor/reduction/cumprod.py +0 -2
- maxframe/tensor/reduction/cumsum.py +0 -2
- maxframe/tensor/reduction/max.py +0 -2
- maxframe/tensor/reduction/mean.py +0 -2
- maxframe/tensor/reduction/min.py +0 -2
- maxframe/tensor/reduction/nanargmax.py +0 -2
- maxframe/tensor/reduction/nanargmin.py +0 -2
- maxframe/tensor/reduction/nancumprod.py +0 -2
- maxframe/tensor/reduction/nancumsum.py +0 -2
- maxframe/tensor/reduction/nanmax.py +0 -2
- maxframe/tensor/reduction/nanmean.py +0 -2
- maxframe/tensor/reduction/nanmin.py +0 -2
- maxframe/tensor/reduction/nanprod.py +0 -2
- maxframe/tensor/reduction/nanstd.py +0 -2
- maxframe/tensor/reduction/nansum.py +0 -2
- maxframe/tensor/reduction/nanvar.py +0 -2
- maxframe/tensor/reduction/prod.py +0 -2
- maxframe/tensor/reduction/std.py +0 -2
- maxframe/tensor/reduction/sum.py +0 -2
- maxframe/tensor/reduction/tests/test_reduction.py +1 -4
- maxframe/tensor/reduction/var.py +0 -2
- maxframe/tensor/reshape/__init__.py +0 -2
- maxframe/tensor/reshape/reshape.py +6 -5
- maxframe/tensor/reshape/tests/__init__.py +0 -2
- maxframe/tensor/reshape/tests/test_reshape.py +0 -2
- maxframe/tensor/sort/__init__.py +16 -0
- maxframe/tensor/sort/argsort.py +150 -0
- maxframe/tensor/sort/sort.py +295 -0
- maxframe/tensor/special/__init__.py +37 -0
- maxframe/tensor/special/core.py +38 -0
- maxframe/tensor/special/misc.py +142 -0
- maxframe/tensor/special/statistical.py +56 -0
- maxframe/tensor/statistics/__init__.py +5 -0
- maxframe/tensor/statistics/average.py +143 -0
- maxframe/tensor/statistics/bincount.py +133 -0
- maxframe/tensor/statistics/quantile.py +10 -8
- maxframe/tensor/ufunc/__init__.py +0 -2
- maxframe/tensor/ufunc/ufunc.py +0 -2
- maxframe/tensor/utils.py +21 -3
- maxframe/tests/test_protocol.py +3 -3
- maxframe/tests/test_utils.py +210 -1
- maxframe/tests/utils.py +59 -1
- maxframe/udf.py +76 -6
- maxframe/utils.py +418 -17
- {maxframe-1.3.1.dist-info → maxframe-2.0.0b2.dist-info}/METADATA +4 -1
- maxframe-2.0.0b2.dist-info/RECORD +939 -0
- {maxframe-1.3.1.dist-info → maxframe-2.0.0b2.dist-info}/WHEEL +1 -1
- maxframe_client/clients/framedriver.py +19 -3
- maxframe_client/fetcher.py +113 -6
- maxframe_client/session/odps.py +173 -38
- maxframe_client/session/task.py +3 -1
- maxframe_client/tests/test_session.py +41 -5
- maxframe-1.3.1.dist-info/RECORD +0 -705
- {maxframe-1.3.1.dist-info → maxframe-2.0.0b2.dist-info}/top_level.txt +0 -0
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
import os
|
|
15
16
|
from typing import Any, Dict, List
|
|
16
17
|
|
|
17
18
|
import msgpack
|
|
@@ -34,6 +35,13 @@ from maxframe.utils import (
|
|
|
34
35
|
wait_http_response,
|
|
35
36
|
)
|
|
36
37
|
|
|
38
|
+
# use long timeout period for debuggers
|
|
39
|
+
_client_req_timeout = (
|
|
40
|
+
None
|
|
41
|
+
if "VSCODE_PID" not in os.environ and "PYCHARM_HOSTED" not in os.environ
|
|
42
|
+
else 1024
|
|
43
|
+
)
|
|
44
|
+
|
|
37
45
|
|
|
38
46
|
class FrameDriverClient:
|
|
39
47
|
def __init__(self, endpoint: str):
|
|
@@ -45,13 +53,18 @@ class FrameDriverClient:
|
|
|
45
53
|
)
|
|
46
54
|
req_url = f"{self._endpoint}/api/sessions"
|
|
47
55
|
resp = await httpclient.AsyncHTTPClient().fetch(
|
|
48
|
-
req_url,
|
|
56
|
+
req_url,
|
|
57
|
+
method="POST",
|
|
58
|
+
body=serialize_serializable(req_body),
|
|
59
|
+
request_timeout=_client_req_timeout,
|
|
49
60
|
)
|
|
50
61
|
return SessionInfo.from_json(msgpack.loads(resp.body))
|
|
51
62
|
|
|
52
63
|
async def get_session(self, session_id: str) -> SessionInfo:
|
|
53
64
|
req_url = f"{self._endpoint}/api/sessions/{session_id}"
|
|
54
|
-
resp = await httpclient.AsyncHTTPClient().fetch(
|
|
65
|
+
resp = await httpclient.AsyncHTTPClient().fetch(
|
|
66
|
+
req_url, method="GET", request_timeout=_client_req_timeout
|
|
67
|
+
)
|
|
55
68
|
return SessionInfo.from_json(msgpack.loads(resp.body))
|
|
56
69
|
|
|
57
70
|
async def delete_session(self, session_id: str):
|
|
@@ -73,12 +86,15 @@ class FrameDriverClient:
|
|
|
73
86
|
req_url,
|
|
74
87
|
method="POST",
|
|
75
88
|
body=serialize_serializable(ProtocolBody(body=req_body)),
|
|
89
|
+
request_timeout=_client_req_timeout,
|
|
76
90
|
)
|
|
77
91
|
return DagInfo.from_json(msgpack.loads(resp.body))
|
|
78
92
|
|
|
79
93
|
async def get_dag_info(self, session_id: str, dag_id: str) -> DagInfo:
|
|
80
94
|
req_url = f"{self._endpoint}/api/sessions/{session_id}/dags/{dag_id}"
|
|
81
|
-
resp = await httpclient.AsyncHTTPClient().fetch(
|
|
95
|
+
resp = await httpclient.AsyncHTTPClient().fetch(
|
|
96
|
+
req_url, method="GET", request_timeout=_client_req_timeout
|
|
97
|
+
)
|
|
82
98
|
return DagInfo.from_json(msgpack.loads(resp.body))
|
|
83
99
|
|
|
84
100
|
async def wait_dag(self, session_id: str, dag_id: str, timeout: TimeoutType = None):
|
maxframe_client/fetcher.py
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
import sys
|
|
15
16
|
from abc import ABC, abstractmethod
|
|
16
17
|
from numbers import Integral
|
|
17
18
|
from typing import Any, Dict, List, Optional, Tuple, Type, Union
|
|
@@ -21,6 +22,7 @@ import pyarrow as pa
|
|
|
21
22
|
from odps import ODPS
|
|
22
23
|
from odps.models import ExternalVolume
|
|
23
24
|
|
|
25
|
+
from maxframe import utils
|
|
24
26
|
from maxframe.core import OBJECT_TYPE
|
|
25
27
|
from maxframe.dataframe.core import DATAFRAME_TYPE
|
|
26
28
|
from maxframe.io.objects import get_object_io_handler
|
|
@@ -33,6 +35,7 @@ from maxframe.io.odpsio import (
|
|
|
33
35
|
odps_schema_to_pandas_dtypes,
|
|
34
36
|
)
|
|
35
37
|
from maxframe.protocol import (
|
|
38
|
+
ConstantResultInfo,
|
|
36
39
|
DataFrameTableMeta,
|
|
37
40
|
ODPSTableResultInfo,
|
|
38
41
|
ODPSVolumeResultInfo,
|
|
@@ -41,10 +44,19 @@ from maxframe.protocol import (
|
|
|
41
44
|
)
|
|
42
45
|
from maxframe.tensor.core import TENSOR_TYPE
|
|
43
46
|
from maxframe.typing_ import PandasObjectTypes, TileableType
|
|
44
|
-
from maxframe.utils import
|
|
47
|
+
from maxframe.utils import (
|
|
48
|
+
ToThreadMixin,
|
|
49
|
+
estimate_pandas_size,
|
|
50
|
+
estimate_table_size,
|
|
51
|
+
sync_pyodps_options,
|
|
52
|
+
)
|
|
45
53
|
|
|
46
54
|
_result_fetchers: Dict[ResultType, Type["ResultFetcher"]] = dict()
|
|
47
55
|
|
|
56
|
+
_FetchIndexType = Optional[List[Union[None, Integral, slice]]]
|
|
57
|
+
|
|
58
|
+
_VOLUME_LOAD_RETRY_TIMES = 5
|
|
59
|
+
|
|
48
60
|
|
|
49
61
|
def register_fetcher(fetcher_cls: Type["ResultFetcher"]):
|
|
50
62
|
_result_fetchers[fetcher_cls.result_type] = fetcher_cls
|
|
@@ -74,10 +86,18 @@ class ResultFetcher(ABC):
|
|
|
74
86
|
self,
|
|
75
87
|
tileable: TileableType,
|
|
76
88
|
info: ResultInfo,
|
|
77
|
-
indexes:
|
|
89
|
+
indexes: _FetchIndexType,
|
|
78
90
|
) -> Any:
|
|
79
91
|
raise NotImplementedError
|
|
80
92
|
|
|
93
|
+
@abstractmethod
|
|
94
|
+
def estimate_size(
|
|
95
|
+
self,
|
|
96
|
+
tileable: TileableType,
|
|
97
|
+
info: ResultInfo,
|
|
98
|
+
) -> Union[int, float]:
|
|
99
|
+
raise NotImplementedError
|
|
100
|
+
|
|
81
101
|
|
|
82
102
|
@register_fetcher
|
|
83
103
|
class NullFetcher(ResultFetcher):
|
|
@@ -94,10 +114,58 @@ class NullFetcher(ResultFetcher):
|
|
|
94
114
|
self,
|
|
95
115
|
tileable: TileableType,
|
|
96
116
|
info: ODPSTableResultInfo,
|
|
97
|
-
indexes:
|
|
117
|
+
indexes: _FetchIndexType,
|
|
98
118
|
) -> None:
|
|
99
119
|
return
|
|
100
120
|
|
|
121
|
+
def estimate_size(
|
|
122
|
+
self,
|
|
123
|
+
tileable: TileableType,
|
|
124
|
+
info: ResultInfo,
|
|
125
|
+
) -> Union[int, float]:
|
|
126
|
+
return 0
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
@register_fetcher
|
|
130
|
+
class ConstantFetcher(ResultFetcher):
|
|
131
|
+
result_type = ResultType.CONSTANT
|
|
132
|
+
|
|
133
|
+
async def update_tileable_meta(
|
|
134
|
+
self,
|
|
135
|
+
tileable: TileableType,
|
|
136
|
+
info: ConstantResultInfo,
|
|
137
|
+
) -> None:
|
|
138
|
+
if isinstance(tileable, DATAFRAME_TYPE) and tileable.dtypes is None:
|
|
139
|
+
tileable.refresh_from_dtypes(info.data.dtypes)
|
|
140
|
+
if tileable.shape and any(pd.isna(x) for x in tileable.shape):
|
|
141
|
+
tileable.params = {"shape": info.data.shape}
|
|
142
|
+
|
|
143
|
+
async def fetch(
|
|
144
|
+
self,
|
|
145
|
+
tileable: TileableType,
|
|
146
|
+
info: ConstantResultInfo,
|
|
147
|
+
indexes: List[Union[None, Integral, slice]],
|
|
148
|
+
) -> Any:
|
|
149
|
+
result = info.data
|
|
150
|
+
if indexes:
|
|
151
|
+
if isinstance(indexes, List):
|
|
152
|
+
indexes = tuple(indexes)
|
|
153
|
+
if isinstance(result, (pd.DataFrame, pd.Series)):
|
|
154
|
+
result = result.iloc[indexes]
|
|
155
|
+
else:
|
|
156
|
+
result = result[indexes]
|
|
157
|
+
return result
|
|
158
|
+
|
|
159
|
+
def estimate_size(
|
|
160
|
+
self,
|
|
161
|
+
tileable: TileableType,
|
|
162
|
+
info: ConstantResultInfo,
|
|
163
|
+
) -> Union[int, float]:
|
|
164
|
+
if isinstance(info.data, (pd.DataFrame, pd.Series, pd.Index)):
|
|
165
|
+
return estimate_pandas_size(info.data)
|
|
166
|
+
else:
|
|
167
|
+
return sys.getsizeof(info.data)
|
|
168
|
+
|
|
101
169
|
|
|
102
170
|
@register_fetcher
|
|
103
171
|
class ODPSTableFetcher(ToThreadMixin, ResultFetcher):
|
|
@@ -220,7 +288,7 @@ class ODPSTableFetcher(ToThreadMixin, ResultFetcher):
|
|
|
220
288
|
self,
|
|
221
289
|
tileable: TileableType,
|
|
222
290
|
info: ODPSTableResultInfo,
|
|
223
|
-
indexes:
|
|
291
|
+
indexes: _FetchIndexType,
|
|
224
292
|
) -> PandasObjectTypes:
|
|
225
293
|
table_meta = build_dataframe_table_meta(tileable)
|
|
226
294
|
arrow_table: pa.Table = await self.to_thread(
|
|
@@ -228,6 +296,15 @@ class ODPSTableFetcher(ToThreadMixin, ResultFetcher):
|
|
|
228
296
|
)
|
|
229
297
|
return arrow_to_pandas(arrow_table, table_meta)
|
|
230
298
|
|
|
299
|
+
def estimate_size(
|
|
300
|
+
self,
|
|
301
|
+
tileable: TileableType,
|
|
302
|
+
info: ODPSTableResultInfo,
|
|
303
|
+
) -> Union[int, float]:
|
|
304
|
+
return estimate_table_size(
|
|
305
|
+
self._odps_entry, info.full_table_name, info.partition_specs
|
|
306
|
+
)
|
|
307
|
+
|
|
231
308
|
|
|
232
309
|
@register_fetcher
|
|
233
310
|
class ODPSVolumeFetcher(ToThreadMixin, ResultFetcher):
|
|
@@ -238,7 +315,29 @@ class ODPSVolumeFetcher(ToThreadMixin, ResultFetcher):
|
|
|
238
315
|
tileable: TileableType,
|
|
239
316
|
info: ODPSVolumeResultInfo,
|
|
240
317
|
) -> None:
|
|
241
|
-
|
|
318
|
+
def volume_fetch_func():
|
|
319
|
+
reader = ODPSVolumeReader(
|
|
320
|
+
self._odps_entry,
|
|
321
|
+
info.volume_name,
|
|
322
|
+
info.volume_path,
|
|
323
|
+
replace_internal_host=True,
|
|
324
|
+
)
|
|
325
|
+
io_handler = get_object_io_handler(tileable)()
|
|
326
|
+
return utils.call_with_retry(
|
|
327
|
+
io_handler.read_object_meta,
|
|
328
|
+
reader,
|
|
329
|
+
tileable,
|
|
330
|
+
retry_timeout=_VOLUME_LOAD_RETRY_TIMES,
|
|
331
|
+
delay=2,
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
volume = await self.to_thread(self._odps_entry.get_volume, info.volume_name)
|
|
335
|
+
if isinstance(volume, ExternalVolume):
|
|
336
|
+
meta = await self.to_thread(volume_fetch_func)
|
|
337
|
+
meta.pop("nsplits", None)
|
|
338
|
+
tileable.params = meta
|
|
339
|
+
else:
|
|
340
|
+
raise NotImplementedError(f"Volume type {type(volume)} not supported")
|
|
242
341
|
|
|
243
342
|
async def _fetch_object(
|
|
244
343
|
self,
|
|
@@ -266,8 +365,16 @@ class ODPSVolumeFetcher(ToThreadMixin, ResultFetcher):
|
|
|
266
365
|
self,
|
|
267
366
|
tileable: TileableType,
|
|
268
367
|
info: ODPSVolumeResultInfo,
|
|
269
|
-
indexes:
|
|
368
|
+
indexes: _FetchIndexType,
|
|
270
369
|
) -> Any:
|
|
271
370
|
if isinstance(tileable, (OBJECT_TYPE, TENSOR_TYPE)):
|
|
272
371
|
return await self._fetch_object(tileable, info, indexes)
|
|
273
372
|
raise NotImplementedError(f"Fetching {type(tileable)} not implemented")
|
|
373
|
+
|
|
374
|
+
def estimate_size(
|
|
375
|
+
self,
|
|
376
|
+
tileable: TileableType,
|
|
377
|
+
info: ResultInfo,
|
|
378
|
+
) -> Union[int, float]:
|
|
379
|
+
# todo estimate size of volume
|
|
380
|
+
return float("inf")
|
maxframe_client/session/odps.py
CHANGED
|
@@ -19,26 +19,30 @@ import logging
|
|
|
19
19
|
import time
|
|
20
20
|
import weakref
|
|
21
21
|
from numbers import Integral
|
|
22
|
-
from typing import Any, Dict, List, Mapping, Optional, Tuple, Union
|
|
22
|
+
from typing import Any, Callable, Dict, List, Mapping, Optional, Tuple, Union
|
|
23
23
|
from urllib.parse import urlparse
|
|
24
24
|
|
|
25
25
|
import numpy as np
|
|
26
26
|
import pandas as pd
|
|
27
27
|
from odps import ODPS
|
|
28
28
|
from odps import options as odps_options
|
|
29
|
+
from odps.config import option_context as odps_option_context
|
|
29
30
|
from odps.console import in_ipython_frontend
|
|
30
31
|
|
|
32
|
+
from maxframe.codegen import CodeGenResult
|
|
33
|
+
from maxframe.codegen.spe import SPECodeGenerator
|
|
31
34
|
from maxframe.config import options
|
|
32
35
|
from maxframe.core import Entity, TileableGraph, build_fetch, enter_mode
|
|
33
|
-
from maxframe.core.operator import Fetch
|
|
36
|
+
from maxframe.core.operator import Fetch, estimate_tileable_execution_size
|
|
34
37
|
from maxframe.dataframe import read_odps_table
|
|
35
|
-
from maxframe.dataframe.core import DATAFRAME_TYPE, SERIES_TYPE
|
|
38
|
+
from maxframe.dataframe.core import DATAFRAME_TYPE, INDEX_TYPE, SERIES_TYPE
|
|
36
39
|
from maxframe.dataframe.datasource import PandasDataSourceOperator
|
|
37
40
|
from maxframe.dataframe.datasource.read_odps_table import DataFrameReadODPSTable
|
|
38
41
|
from maxframe.errors import (
|
|
39
42
|
MaxFrameError,
|
|
40
43
|
NoTaskServerResponseError,
|
|
41
44
|
SessionAlreadyClosedError,
|
|
45
|
+
TileableNotExecutedError,
|
|
42
46
|
)
|
|
43
47
|
from maxframe.io.objects import get_object_io_handler
|
|
44
48
|
from maxframe.io.odpsio import (
|
|
@@ -48,8 +52,9 @@ from maxframe.io.odpsio import (
|
|
|
48
52
|
pandas_to_odps_schema,
|
|
49
53
|
)
|
|
50
54
|
from maxframe.protocol import (
|
|
55
|
+
ConstantResultInfo,
|
|
51
56
|
DagInfo,
|
|
52
|
-
|
|
57
|
+
ExecutionStatus,
|
|
53
58
|
ODPSTableResultInfo,
|
|
54
59
|
ODPSVolumeResultInfo,
|
|
55
60
|
ResultInfo,
|
|
@@ -62,13 +67,16 @@ from maxframe.session import (
|
|
|
62
67
|
Profiling,
|
|
63
68
|
Progress,
|
|
64
69
|
)
|
|
70
|
+
from maxframe.sperunner import SPEDagRunner
|
|
65
71
|
from maxframe.tensor.datasource import ArrayDataSource
|
|
66
72
|
from maxframe.typing_ import TileableType
|
|
67
73
|
from maxframe.utils import (
|
|
68
74
|
ToThreadMixin,
|
|
69
75
|
build_session_volume_name,
|
|
70
76
|
build_temp_table_name,
|
|
77
|
+
estimate_pandas_size,
|
|
71
78
|
get_default_table_properties,
|
|
79
|
+
no_default,
|
|
72
80
|
str_to_bool,
|
|
73
81
|
sync_pyodps_options,
|
|
74
82
|
)
|
|
@@ -92,6 +100,7 @@ class MaxFrameServiceCaller(metaclass=abc.ABCMeta):
|
|
|
92
100
|
sql_settings.get("odps.task.wlm.quota", None),
|
|
93
101
|
options.spe.task.settings.get("odps.task.wlm.quota", None),
|
|
94
102
|
options.pythonpack.task.settings.get("odps.task.wlm.quota", None),
|
|
103
|
+
options.dpe.task.settings.get("odps.task.wlm.quota", None),
|
|
95
104
|
quota_name,
|
|
96
105
|
}.difference([None])
|
|
97
106
|
if len(quota_settings) >= 2:
|
|
@@ -165,6 +174,41 @@ class MaxFrameServiceCaller(metaclass=abc.ABCMeta):
|
|
|
165
174
|
return None
|
|
166
175
|
|
|
167
176
|
|
|
177
|
+
class LocalSPEDagRunner(SPEDagRunner):
|
|
178
|
+
def __init__(
|
|
179
|
+
self,
|
|
180
|
+
session_id: str,
|
|
181
|
+
subdag_id: str,
|
|
182
|
+
subdag: TileableGraph,
|
|
183
|
+
generated: CodeGenResult,
|
|
184
|
+
settings: Dict[str, Any],
|
|
185
|
+
odps_entry: Optional[ODPS] = None,
|
|
186
|
+
tileable_to_info: Mapping[TileableType, ResultInfo] = None,
|
|
187
|
+
data_tileable_getter: Optional[
|
|
188
|
+
Callable[[TileableType], Tuple[TileableType, Any]]
|
|
189
|
+
] = None,
|
|
190
|
+
loop: asyncio.AbstractEventLoop = None,
|
|
191
|
+
):
|
|
192
|
+
super().__init__(session_id, subdag_id, subdag, generated, settings)
|
|
193
|
+
self._odps = self._odps or odps_entry
|
|
194
|
+
self._tileable_key_to_info = {
|
|
195
|
+
t.key: v for t, v in ({} or tileable_to_info).items()
|
|
196
|
+
}
|
|
197
|
+
self._data_tileable_getter = data_tileable_getter or (lambda x: (x, None))
|
|
198
|
+
self._loop = loop
|
|
199
|
+
|
|
200
|
+
def fetch_data_by_tileable(self, t: TileableType) -> Any:
|
|
201
|
+
tileable, index = self._data_tileable_getter(t)
|
|
202
|
+
result_info = self._tileable_key_to_info[tileable.key]
|
|
203
|
+
fetcher = get_fetcher_cls(result_info.result_type)(self._odps)
|
|
204
|
+
return asyncio.run_coroutine_threadsafe(
|
|
205
|
+
fetcher.fetch(t, result_info, index), self._loop
|
|
206
|
+
).result()
|
|
207
|
+
|
|
208
|
+
def store_data(self, key: str, value: Any) -> ResultInfo:
|
|
209
|
+
return ConstantResultInfo(data=value)
|
|
210
|
+
|
|
211
|
+
|
|
168
212
|
class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
|
|
169
213
|
_odps_entry: Optional[ODPS]
|
|
170
214
|
_tileable_to_infos: Mapping[TileableType, ResultInfo]
|
|
@@ -216,7 +260,7 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
|
|
|
216
260
|
await self._show_logview_address()
|
|
217
261
|
|
|
218
262
|
def _upload_and_get_table_read_tileable(
|
|
219
|
-
self, t: TileableType
|
|
263
|
+
self, t: TileableType, data: Any
|
|
220
264
|
) -> Optional[TileableType]:
|
|
221
265
|
table_schema, table_meta = pandas_to_odps_schema(t, unknown_as_string=True)
|
|
222
266
|
if self._odps_entry.exist_table(table_meta.table_name):
|
|
@@ -224,9 +268,15 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
|
|
|
224
268
|
table_meta.table_name, hints=options.sql.settings
|
|
225
269
|
)
|
|
226
270
|
table_name = build_temp_table_name(self.session_id, t.key)
|
|
271
|
+
schema = (
|
|
272
|
+
self._last_settings.get("session.default_schema", None)
|
|
273
|
+
if self._last_settings.get("session.enable_schema", False)
|
|
274
|
+
else None
|
|
275
|
+
)
|
|
227
276
|
table_obj = self._odps_entry.create_table(
|
|
228
277
|
table_name,
|
|
229
278
|
table_schema,
|
|
279
|
+
schema=schema,
|
|
230
280
|
lifecycle=options.session.temp_table_lifecycle,
|
|
231
281
|
hints=options.sql.settings,
|
|
232
282
|
if_not_exists=True,
|
|
@@ -234,7 +284,6 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
|
|
|
234
284
|
or get_default_table_properties(),
|
|
235
285
|
)
|
|
236
286
|
|
|
237
|
-
data = t.op.get_data()
|
|
238
287
|
batch_size = options.session.upload_batch_size
|
|
239
288
|
|
|
240
289
|
if len(data):
|
|
@@ -268,7 +317,7 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
|
|
|
268
317
|
return read_tileable.data
|
|
269
318
|
|
|
270
319
|
def _upload_and_get_vol_read_tileable(
|
|
271
|
-
self, t: TileableType
|
|
320
|
+
self, t: TileableType, data: Any
|
|
272
321
|
) -> Optional[TileableType]:
|
|
273
322
|
vol_name = build_session_volume_name(self.session_id)
|
|
274
323
|
writer = ODPSVolumeWriter(
|
|
@@ -278,21 +327,35 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
|
|
|
278
327
|
replace_internal_host=self._replace_internal_host,
|
|
279
328
|
)
|
|
280
329
|
io_handler = get_object_io_handler(t)
|
|
281
|
-
io_handler().write_object(writer, t,
|
|
330
|
+
io_handler().write_object(writer, t, data)
|
|
282
331
|
return build_fetch(t).data
|
|
283
332
|
|
|
333
|
+
def _get_local_data(self, t: TileableType) -> Any:
|
|
334
|
+
if isinstance(t.op, (ArrayDataSource, PandasDataSourceOperator)):
|
|
335
|
+
# scenario 1: tensor or DataFrame input
|
|
336
|
+
if t.inputs:
|
|
337
|
+
return no_default
|
|
338
|
+
return t.op.get_data()
|
|
339
|
+
if isinstance(t.op, Fetch):
|
|
340
|
+
# scenario 2: local data
|
|
341
|
+
key_to_tileables = {t.key: t for t in self._tileable_to_infos.keys()}
|
|
342
|
+
if t.key not in key_to_tileables:
|
|
343
|
+
return no_default
|
|
344
|
+
src_info = self._tileable_to_infos[key_to_tileables[t.key]]
|
|
345
|
+
if not isinstance(src_info, ConstantResultInfo):
|
|
346
|
+
return no_default
|
|
347
|
+
return src_info.data
|
|
348
|
+
return no_default
|
|
349
|
+
|
|
284
350
|
def _upload_and_get_read_tileable(self, t: TileableType) -> Optional[TileableType]:
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
or t.inputs
|
|
289
|
-
):
|
|
290
|
-
return None
|
|
351
|
+
local_data = self._get_local_data(t)
|
|
352
|
+
if local_data is no_default:
|
|
353
|
+
return
|
|
291
354
|
with sync_pyodps_options():
|
|
292
|
-
if isinstance(t
|
|
293
|
-
return self._upload_and_get_table_read_tileable(t)
|
|
355
|
+
if isinstance(t, DATAFRAME_TYPE + SERIES_TYPE + INDEX_TYPE):
|
|
356
|
+
return self._upload_and_get_table_read_tileable(t, local_data)
|
|
294
357
|
else:
|
|
295
|
-
return self._upload_and_get_vol_read_tileable(t)
|
|
358
|
+
return self._upload_and_get_vol_read_tileable(t, local_data)
|
|
296
359
|
|
|
297
360
|
@enter_mode(kernel=True, build=True)
|
|
298
361
|
def _scan_and_replace_local_sources(
|
|
@@ -316,7 +379,7 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
|
|
|
316
379
|
|
|
317
380
|
for succ in successors:
|
|
318
381
|
graph.add_edge(replaced, succ)
|
|
319
|
-
succ.op.
|
|
382
|
+
succ.op.inputs = [replacements.get(t, t) for t in succ.inputs]
|
|
320
383
|
|
|
321
384
|
graph.results = [replacements.get(t, t) for t in graph.results]
|
|
322
385
|
return replacements
|
|
@@ -364,6 +427,34 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
|
|
|
364
427
|
self._last_settings = copy.deepcopy(new_settings)
|
|
365
428
|
return update
|
|
366
429
|
|
|
430
|
+
def _is_local_executable(self, tileable_graph: TileableGraph) -> bool:
|
|
431
|
+
from maxframe.codegen.spe.core import get_op_adapter
|
|
432
|
+
|
|
433
|
+
local_exec_size_limit = options.local_execution.size_limit
|
|
434
|
+
if not options.local_execution.enabled or not local_exec_size_limit:
|
|
435
|
+
return False
|
|
436
|
+
|
|
437
|
+
# make sure all ops registered in SPE
|
|
438
|
+
try:
|
|
439
|
+
for tileable in tileable_graph:
|
|
440
|
+
get_op_adapter(type(tileable.op))
|
|
441
|
+
except KeyError:
|
|
442
|
+
return False
|
|
443
|
+
|
|
444
|
+
fetch_sizes = dict()
|
|
445
|
+
for inp in tileable_graph.iter_indep():
|
|
446
|
+
if not isinstance(inp.op, Fetch):
|
|
447
|
+
continue
|
|
448
|
+
local_data = self._get_local_data(inp)
|
|
449
|
+
# todo add resolution of sizes of tensor data type here
|
|
450
|
+
if isinstance(local_data, (pd.DataFrame, pd.Series, pd.Index)):
|
|
451
|
+
fetch_sizes[inp.key] = estimate_pandas_size(local_data)
|
|
452
|
+
|
|
453
|
+
est_exec_size = estimate_tileable_execution_size(
|
|
454
|
+
tileable_graph, fetch_sizes=fetch_sizes
|
|
455
|
+
)
|
|
456
|
+
return local_exec_size_limit and est_exec_size < local_exec_size_limit
|
|
457
|
+
|
|
367
458
|
async def execute(self, *tileables, **kwargs) -> ExecutionInfo:
|
|
368
459
|
tileables = [
|
|
369
460
|
tileable.data if isinstance(tileable, Entity) else tileable
|
|
@@ -373,6 +464,20 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
|
|
|
373
464
|
tileable_graph, to_execute_tileables = gen_submit_tileable_graph(
|
|
374
465
|
self, tileables, tileable_to_copied
|
|
375
466
|
)
|
|
467
|
+
|
|
468
|
+
if self._is_local_executable(tileable_graph):
|
|
469
|
+
return await self._execute_locally(tileable_graph, to_execute_tileables)
|
|
470
|
+
else:
|
|
471
|
+
return await self._execute_in_service(
|
|
472
|
+
tileable_graph, to_execute_tileables, tileable_to_copied
|
|
473
|
+
)
|
|
474
|
+
|
|
475
|
+
async def _execute_in_service(
|
|
476
|
+
self,
|
|
477
|
+
tileable_graph: TileableGraph,
|
|
478
|
+
to_execute_tileables: List[TileableType],
|
|
479
|
+
tileable_to_copied: Dict[TileableType, TileableType],
|
|
480
|
+
) -> ExecutionInfo:
|
|
376
481
|
source_replacements = self._scan_and_replace_local_sources(tileable_graph)
|
|
377
482
|
|
|
378
483
|
# we need to manage uploaded data sources with refcounting mechanism
|
|
@@ -394,7 +499,7 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
|
|
|
394
499
|
progress = Progress()
|
|
395
500
|
profiling = Profiling()
|
|
396
501
|
aio_task = asyncio.create_task(
|
|
397
|
-
self.
|
|
502
|
+
self._run_remotely_in_background(dag_info, to_execute_tileables, progress)
|
|
398
503
|
)
|
|
399
504
|
return ExecutionInfo(
|
|
400
505
|
aio_task,
|
|
@@ -404,7 +509,7 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
|
|
|
404
509
|
to_execute_tileables,
|
|
405
510
|
)
|
|
406
511
|
|
|
407
|
-
async def
|
|
512
|
+
async def _run_remotely_in_background(
|
|
408
513
|
self, dag_info: DagInfo, tileables: List, progress: Progress
|
|
409
514
|
):
|
|
410
515
|
start_time = time.time()
|
|
@@ -458,20 +563,20 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
|
|
|
458
563
|
f"Cannot find DAG with ID {dag_id} in session {session_id}"
|
|
459
564
|
)
|
|
460
565
|
progress.value = dag_info.progress
|
|
461
|
-
if dag_info.status !=
|
|
566
|
+
if dag_info.status != ExecutionStatus.RUNNING:
|
|
462
567
|
break
|
|
463
568
|
await asyncio.sleep(timeout_val)
|
|
464
569
|
except asyncio.CancelledError:
|
|
465
570
|
dag_info = await self.ensure_async_call(self._caller.cancel_dag, dag_id)
|
|
466
|
-
if dag_info.status !=
|
|
571
|
+
if dag_info.status != ExecutionStatus.CANCELLED: # pragma: no cover
|
|
467
572
|
raise
|
|
468
573
|
finally:
|
|
469
|
-
if dag_info.status ==
|
|
574
|
+
if dag_info.status == ExecutionStatus.SUCCEEDED:
|
|
470
575
|
progress.value = 1.0
|
|
471
|
-
elif dag_info.status ==
|
|
576
|
+
elif dag_info.status == ExecutionStatus.FAILED:
|
|
472
577
|
dag_info.error_info.reraise()
|
|
473
578
|
|
|
474
|
-
if dag_info.status in (
|
|
579
|
+
if dag_info.status in (ExecutionStatus.RUNNING, ExecutionStatus.CANCELLED):
|
|
475
580
|
return
|
|
476
581
|
|
|
477
582
|
for key, result_info in dag_info.tileable_to_result_infos.items():
|
|
@@ -480,6 +585,45 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
|
|
|
480
585
|
await fetcher.update_tileable_meta(t, result_info)
|
|
481
586
|
self._tileable_to_infos[t] = result_info
|
|
482
587
|
|
|
588
|
+
async def _execute_locally(
|
|
589
|
+
self,
|
|
590
|
+
tileable_graph: TileableGraph,
|
|
591
|
+
to_execute_tileables: List[TileableType],
|
|
592
|
+
):
|
|
593
|
+
cur_loop = asyncio.get_running_loop()
|
|
594
|
+
|
|
595
|
+
def run_sync(subdag_id):
|
|
596
|
+
codegen = SPECodeGenerator(self.session_id, subdag_id)
|
|
597
|
+
generated_code = codegen.generate(tileable_graph)
|
|
598
|
+
|
|
599
|
+
runner = LocalSPEDagRunner(
|
|
600
|
+
self._session_id,
|
|
601
|
+
subdag_id,
|
|
602
|
+
tileable_graph,
|
|
603
|
+
generated_code,
|
|
604
|
+
settings={},
|
|
605
|
+
odps_entry=self._odps_entry,
|
|
606
|
+
tileable_to_info=self._tileable_to_infos,
|
|
607
|
+
loop=cur_loop,
|
|
608
|
+
)
|
|
609
|
+
with odps_option_context():
|
|
610
|
+
self._odps_entry.to_global()
|
|
611
|
+
key_to_info = runner.run()
|
|
612
|
+
for tileable in to_execute_tileables:
|
|
613
|
+
self._tileable_to_infos[tileable] = key_to_info[tileable.key]
|
|
614
|
+
|
|
615
|
+
mock_subdag_id = f"subdag_local_{int(time.time())}"
|
|
616
|
+
progress = Progress()
|
|
617
|
+
profiling = Profiling()
|
|
618
|
+
aio_task = asyncio.create_task(self.to_thread(run_sync, mock_subdag_id))
|
|
619
|
+
return ExecutionInfo(
|
|
620
|
+
aio_task,
|
|
621
|
+
progress,
|
|
622
|
+
profiling,
|
|
623
|
+
asyncio.get_running_loop(),
|
|
624
|
+
to_execute_tileables,
|
|
625
|
+
)
|
|
626
|
+
|
|
483
627
|
def _get_data_tileable_and_indexes(
|
|
484
628
|
self, tileable: TileableType
|
|
485
629
|
) -> Tuple[TileableType, List[Union[slice, Integral]]]:
|
|
@@ -503,7 +647,9 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
|
|
|
503
647
|
if not all(isinstance(index, (slice, Integral)) for index in indexes):
|
|
504
648
|
raise ValueError("Only support fetch data slices")
|
|
505
649
|
else:
|
|
506
|
-
raise
|
|
650
|
+
raise TileableNotExecutedError(
|
|
651
|
+
f"Cannot fetch unexecuted tileable: {tileable!r}"
|
|
652
|
+
)
|
|
507
653
|
|
|
508
654
|
return tileable, indexes
|
|
509
655
|
|
|
@@ -548,17 +694,6 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
|
|
|
548
694
|
async def get_web_endpoint(self) -> Optional[str]:
|
|
549
695
|
raise NotImplementedError
|
|
550
696
|
|
|
551
|
-
async def create_remote_object(
|
|
552
|
-
self, session_id: str, name: str, object_cls, *args, **kwargs
|
|
553
|
-
):
|
|
554
|
-
raise NotImplementedError
|
|
555
|
-
|
|
556
|
-
async def get_remote_object(self, session_id: str, name: str):
|
|
557
|
-
raise NotImplementedError
|
|
558
|
-
|
|
559
|
-
async def destroy_remote_object(self, session_id: str, name: str):
|
|
560
|
-
raise NotImplementedError
|
|
561
|
-
|
|
562
697
|
async def create_mutable_tensor(
|
|
563
698
|
self,
|
|
564
699
|
shape: tuple,
|
|
@@ -602,7 +737,7 @@ class MaxFrameRestCaller(MaxFrameServiceCaller):
|
|
|
602
737
|
self._session_id = None
|
|
603
738
|
|
|
604
739
|
async def create_session(self) -> SessionInfo:
|
|
605
|
-
info = await self._client.create_session(
|
|
740
|
+
info = await self._client.create_session(self.get_settings_to_upload())
|
|
606
741
|
self._session_id = info.session_id
|
|
607
742
|
return info
|
|
608
743
|
|
maxframe_client/session/task.py
CHANGED
|
@@ -180,7 +180,9 @@ class MaxFrameInstanceCaller(MaxFrameServiceCaller):
|
|
|
180
180
|
if status_json.get("status") == "Running":
|
|
181
181
|
break
|
|
182
182
|
if time.time() - check_time > timeout:
|
|
183
|
-
raise TimeoutError(
|
|
183
|
+
raise TimeoutError(
|
|
184
|
+
f"Check session startup time out. Instance ID: {self._instance.id}"
|
|
185
|
+
)
|
|
184
186
|
time.sleep(interval)
|
|
185
187
|
interval = min(max_interval, interval * 2)
|
|
186
188
|
|