mplang-nightly 0.1.dev182__tar.gz → 0.1.dev184__tar.gz
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.
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/PKG-INFO +1 -1
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/cluster.py +11 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/comm.py +4 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/communicator.py +15 -2
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/server.py +3 -4
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/session.py +32 -27
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/runtime/test_communicator.py +5 -3
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/.gitignore +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/LICENSE +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/README.md +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/conf/3pc.yaml +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/stax_nn/README.md +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/stax_nn/models.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/stax_nn/stax_nn.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/xgboost/hist_jax.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/xgboost/hist_jax_test.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/xgboost/naive_np.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/xgboost/readme.md +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/xgboost/sgb.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/xgboost/sgb_test.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/hatch_build.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/analysis/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/analysis/diagram.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/context_mgr.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/dtypes.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/expr/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/expr/ast.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/expr/evaluator.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/expr/printer.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/expr/transformer.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/expr/utils.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/expr/visitor.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/expr/walk.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/interp.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/mask.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/mpir.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/mpobject.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/mptype.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/pfunc.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/primitive.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/table.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/tensor.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/tracer.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/device.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/host.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/base.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/basic.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/context.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/crypto.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/mock_tee.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/phe.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/spu.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/sql_duckdb.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/stablehlo.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/value.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/base.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/basic.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/crypto.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/ibis_cc.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/jax_cc.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/phe.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/spu.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/sql_cc.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/tee.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/protos/v1alpha1/mpir_pb2.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/protos/v1alpha1/mpir_pb2.pyi +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/protos/v1alpha1/value_pb2.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/protos/v1alpha1/value_pb2.pyi +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/cli.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/client.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/data_providers.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/driver.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/exceptions.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/http_api.md +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/link_comm.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/simulation.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/simp/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/simp/api.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/simp/mpi.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/simp/party.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/simp/random.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/simp/smpc.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/utils/crypto.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/utils/func_utils.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/utils/spu_utils.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/utils/table_utils.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/pyproject.toml +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/analysis/test_diagram.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/conftest.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/expr/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/expr/conftest.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/expr/test_ast.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/expr/test_printer.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/expr/test_utils.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/expr/test_walk.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_cluster.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_dtype.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_mask.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_mpir.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_mptype.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_primitive.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_table.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_tensor.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_tracer.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/device/test_device_basic.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/README.md +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/test_crypto_roundtrip.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/test_http_e2e.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/test_symbols_roundtrip.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/test_tee_workflow.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/test_tutorials.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/test_unused_param_integration.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_basic.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_debug_print.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_kernel_binding.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_phe.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_spu.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_sql_duckdb.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_stablehlo.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_value.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_value_serde.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/dummy.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_basic_pack.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_feop_base.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_ibis.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_ibis_cc.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_jax_cc.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_phe.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_spu.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_spu_defensive.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_sql.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_table_tensor_conversion.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/runtime/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/runtime/test_cli.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/runtime/test_driver.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/runtime/test_server.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/runtime/test_simulation.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/simp/test_mpi.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/simp/test_random.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/simp/test_smpc.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/simp/test_sugar.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/utils/server_fixtures.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/utils/test_func_utils.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/utils/test_spu_utils.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/utils/test_table_utils.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/0_basic.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/10_analysis.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/1_condition.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/2_whileloop.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/3_device.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/4_simulation.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/5_ir_dump.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/6_advanced.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/7_stdio.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/8_phe.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/9_tee.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/__init__.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/pitfalls/late_binding.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/pitfalls/rand.py +0 -0
- {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/run.sh +0 -0
|
@@ -20,6 +20,7 @@ MPLang cluster configuration.
|
|
|
20
20
|
from __future__ import annotations
|
|
21
21
|
|
|
22
22
|
from dataclasses import dataclass, field
|
|
23
|
+
from functools import cached_property
|
|
23
24
|
from typing import Any
|
|
24
25
|
|
|
25
26
|
|
|
@@ -169,6 +170,16 @@ class ClusterSpec:
|
|
|
169
170
|
},
|
|
170
171
|
}
|
|
171
172
|
|
|
173
|
+
@cached_property
|
|
174
|
+
def endpoints(self) -> list[str]:
|
|
175
|
+
eps: list[str] = []
|
|
176
|
+
for n in sorted(
|
|
177
|
+
self.nodes.values(),
|
|
178
|
+
key=lambda x: x.rank, # type: ignore[attr-defined]
|
|
179
|
+
):
|
|
180
|
+
eps.append(n.endpoint)
|
|
181
|
+
return eps
|
|
182
|
+
|
|
172
183
|
@classmethod
|
|
173
184
|
def from_dict(cls, config: dict[str, Any]) -> ClusterSpec:
|
|
174
185
|
"""Parses a raw config dictionary and returns a validated ClusterSpec."""
|
|
@@ -48,6 +48,10 @@ class ICommunicator(ABC):
|
|
|
48
48
|
def recv(self, frm: int, key: str) -> Any:
|
|
49
49
|
"""Receive data from peer with the given key"""
|
|
50
50
|
|
|
51
|
+
@abstractmethod
|
|
52
|
+
def onSent(self, frm: int, key: str, data: Any) -> None:
|
|
53
|
+
"""Called when a key is sent to self"""
|
|
54
|
+
|
|
51
55
|
|
|
52
56
|
class ICollective(ABC):
|
|
53
57
|
"""Interface for collective communication"""
|
|
@@ -29,12 +29,25 @@ from mplang.kernels.value import Value, decode_value, encode_value
|
|
|
29
29
|
|
|
30
30
|
class HttpCommunicator(CommunicatorBase):
|
|
31
31
|
def __init__(self, session_name: str, rank: int, endpoints: list[str]):
|
|
32
|
+
# Validate endpoints
|
|
33
|
+
if not endpoints:
|
|
34
|
+
raise ValueError("endpoints cannot be empty")
|
|
35
|
+
|
|
36
|
+
if not all(endpoint for endpoint in endpoints):
|
|
37
|
+
raise ValueError("endpoints cannot contain empty elements")
|
|
38
|
+
|
|
32
39
|
super().__init__(rank, len(endpoints))
|
|
33
40
|
self.session_name = session_name
|
|
34
|
-
|
|
41
|
+
# Ensure all endpoints have protocol prefix
|
|
42
|
+
self.endpoints = [
|
|
43
|
+
endpoint
|
|
44
|
+
if endpoint.startswith(("http://", "https://"))
|
|
45
|
+
else f"http://{endpoint}"
|
|
46
|
+
for endpoint in endpoints
|
|
47
|
+
]
|
|
35
48
|
self._counter = 0
|
|
36
49
|
logging.info(
|
|
37
|
-
f"HttpCommunicator initialized: session={session_name}, rank={rank}, endpoints={endpoints}"
|
|
50
|
+
f"HttpCommunicator initialized: session={session_name}, rank={rank}, endpoints={self.endpoints}"
|
|
38
51
|
)
|
|
39
52
|
|
|
40
53
|
# override
|
|
@@ -31,6 +31,7 @@ from fastapi.responses import JSONResponse
|
|
|
31
31
|
from pydantic import BaseModel
|
|
32
32
|
|
|
33
33
|
from mplang.core import IrReader, TableType, TensorType
|
|
34
|
+
from mplang.core.cluster import ClusterSpec
|
|
34
35
|
from mplang.kernels.base import KernelContext
|
|
35
36
|
from mplang.kernels.value import Value, decode_value, encode_value
|
|
36
37
|
from mplang.protos.v1alpha1 import mpir_pb2
|
|
@@ -40,6 +41,7 @@ from mplang.runtime.session import (
|
|
|
40
41
|
Computation,
|
|
41
42
|
Session,
|
|
42
43
|
Symbol,
|
|
44
|
+
create_session_from_spec,
|
|
43
45
|
)
|
|
44
46
|
|
|
45
47
|
logger = logging.getLogger(__name__)
|
|
@@ -260,15 +262,12 @@ def list_session_computations(session_name: str) -> ComputationListResponse:
|
|
|
260
262
|
def create_session(session_name: str, request: CreateSessionRequest) -> SessionResponse:
|
|
261
263
|
validate_name(session_name, "session")
|
|
262
264
|
# Delegate cluster spec parsing & session construction to resource layer
|
|
263
|
-
from mplang.core.cluster import ClusterSpec # local import to avoid cycles
|
|
264
265
|
|
|
265
266
|
if session_name in _sessions:
|
|
266
267
|
sess = _sessions[session_name]
|
|
267
268
|
else:
|
|
268
269
|
spec = ClusterSpec.from_dict(request.cluster_spec)
|
|
269
|
-
|
|
270
|
-
raise InvalidRequestError("No SPU device found in cluster_spec for session")
|
|
271
|
-
sess = Session(name=session_name, rank=request.rank, cluster_spec=spec)
|
|
270
|
+
sess = create_session_from_spec(name=session_name, rank=request.rank, spec=spec)
|
|
272
271
|
_sessions[session_name] = sess
|
|
273
272
|
return SessionResponse(name=sess.name)
|
|
274
273
|
|
|
@@ -34,6 +34,8 @@ from urllib.parse import urlparse
|
|
|
34
34
|
|
|
35
35
|
import spu.libspu as libspu
|
|
36
36
|
|
|
37
|
+
from mplang.core.cluster import ClusterSpec
|
|
38
|
+
from mplang.core.comm import ICommunicator
|
|
37
39
|
from mplang.core.expr.ast import Expr
|
|
38
40
|
from mplang.core.expr.evaluator import IEvaluator, create_evaluator
|
|
39
41
|
from mplang.core.mask import Mask
|
|
@@ -96,19 +98,25 @@ class SessionState:
|
|
|
96
98
|
class Session:
|
|
97
99
|
"""Represents the per-rank execution context.
|
|
98
100
|
|
|
99
|
-
Immutable config: name, rank, cluster_spec.
|
|
101
|
+
Immutable config: name, rank, cluster_spec, communicator.
|
|
100
102
|
Derived: node, runtime_info, endpoints, spu_device, spu_mask, protocol/field, is_spu_party.
|
|
101
103
|
Mutable: state (runtime object, symbols, computations, seeded flag).
|
|
104
|
+
|
|
105
|
+
Note: communicator is assumed to be initialized with cluster spec info (e.g. endpoints).
|
|
102
106
|
"""
|
|
103
107
|
|
|
104
|
-
def __init__(
|
|
108
|
+
def __init__(
|
|
109
|
+
self,
|
|
110
|
+
name: str,
|
|
111
|
+
rank: int,
|
|
112
|
+
cluster_spec: ClusterSpec,
|
|
113
|
+
communicator: ICommunicator,
|
|
114
|
+
):
|
|
105
115
|
self.name = name
|
|
106
116
|
self.rank = rank
|
|
107
117
|
self.cluster_spec = cluster_spec
|
|
108
118
|
self.state = SessionState()
|
|
109
|
-
self.communicator =
|
|
110
|
-
session_name=name, rank=rank, endpoints=self.endpoints
|
|
111
|
-
)
|
|
119
|
+
self.communicator = communicator
|
|
112
120
|
|
|
113
121
|
# --- Derived topology ---
|
|
114
122
|
@cached_property
|
|
@@ -119,18 +127,9 @@ class Session:
|
|
|
119
127
|
def runtime_info(self) -> RuntimeInfo:
|
|
120
128
|
return self.node.runtime_info
|
|
121
129
|
|
|
122
|
-
@
|
|
130
|
+
@property
|
|
123
131
|
def endpoints(self) -> list[str]:
|
|
124
|
-
|
|
125
|
-
for n in sorted(
|
|
126
|
-
self.cluster_spec.nodes.values(),
|
|
127
|
-
key=lambda x: x.rank, # type: ignore[attr-defined]
|
|
128
|
-
):
|
|
129
|
-
ep = n.endpoint
|
|
130
|
-
if not ep.startswith(("http://", "https://")):
|
|
131
|
-
ep = f"http://{ep}"
|
|
132
|
-
eps.append(ep)
|
|
133
|
-
return eps
|
|
132
|
+
return self.cluster_spec.endpoints
|
|
134
133
|
|
|
135
134
|
@cached_property
|
|
136
135
|
def spu_device(self): # type: ignore
|
|
@@ -191,10 +190,11 @@ class Session:
|
|
|
191
190
|
if self.is_spu_party:
|
|
192
191
|
# Build SPU address list across all endpoints for ranks in mask
|
|
193
192
|
spu_addrs: list[str] = []
|
|
194
|
-
for r, addr in enumerate(self.
|
|
193
|
+
for r, addr in enumerate(self.cluster_spec.endpoints):
|
|
195
194
|
if r in self.spu_mask:
|
|
196
|
-
|
|
197
|
-
|
|
195
|
+
# TODO(oeqqwq): addr may contain other schema like grpc://
|
|
196
|
+
if not addr.startswith(("http://", "https://")):
|
|
197
|
+
addr = f"http://{addr}"
|
|
198
198
|
parsed = urlparse(addr)
|
|
199
199
|
assert isinstance(parsed.port, int)
|
|
200
200
|
new_addr = f"{parsed.hostname}:{parsed.port + SPU_PORT_OFFSET}"
|
|
@@ -281,12 +281,17 @@ class Session:
|
|
|
281
281
|
)
|
|
282
282
|
self.add_symbol(Symbol(name=name, mptype={}, data=val))
|
|
283
283
|
|
|
284
|
-
# --- Convenience constructor ---
|
|
285
|
-
@classmethod
|
|
286
|
-
def from_cluster_spec_dict(cls, name: str, rank: int, spec_dict: dict) -> Session:
|
|
287
|
-
from mplang.core.cluster import ClusterSpec # local import to avoid cycles
|
|
288
284
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
285
|
+
# --- Convenience constructor use HttpCommunicator---
|
|
286
|
+
def create_session_from_spec(name: str, rank: int, spec: ClusterSpec) -> Session:
|
|
287
|
+
if len(spec.get_devices_by_kind("SPU")) == 0:
|
|
288
|
+
raise RuntimeError("No SPU device found in cluster_spec")
|
|
289
|
+
|
|
290
|
+
# Create HttpCommunicator for the session
|
|
291
|
+
communicator = HttpCommunicator(
|
|
292
|
+
session_name=name,
|
|
293
|
+
rank=rank,
|
|
294
|
+
endpoints=spec.endpoints,
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
return Session(name=name, rank=rank, cluster_spec=spec, communicator=communicator)
|
|
@@ -24,7 +24,7 @@ import uvicorn
|
|
|
24
24
|
from mplang.core.cluster import ClusterSpec
|
|
25
25
|
from mplang.runtime.communicator import HttpCommunicator
|
|
26
26
|
from mplang.runtime.server import app, register_session
|
|
27
|
-
from mplang.runtime.session import
|
|
27
|
+
from mplang.runtime.session import create_session_from_spec
|
|
28
28
|
from tests.utils.server_fixtures import http_servers # noqa: F401 (fixture)
|
|
29
29
|
|
|
30
30
|
|
|
@@ -194,10 +194,12 @@ def run_party_e2e_process(
|
|
|
194
194
|
runtime_version="test",
|
|
195
195
|
runtime_platform="test",
|
|
196
196
|
).to_dict()
|
|
197
|
-
|
|
197
|
+
# Create ClusterSpec from dict, then create session
|
|
198
|
+
cluster_spec = ClusterSpec.from_dict(cluster_spec_dict)
|
|
199
|
+
sess = create_session_from_spec(
|
|
198
200
|
name=session_name,
|
|
199
201
|
rank=rank,
|
|
200
|
-
|
|
202
|
+
spec=cluster_spec,
|
|
201
203
|
)
|
|
202
204
|
register_session(sess)
|
|
203
205
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/protos/v1alpha1/value_pb2.pyi
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/test_crypto_roundtrip.py
RENAMED
|
File without changes
|
|
File without changes
|
{mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/test_symbols_roundtrip.py
RENAMED
|
File without changes
|
{mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/test_tee_workflow.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_kernel_binding.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_table_tensor_conversion.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|