letify 2.4.5__tar.gz → 2.4.6__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.
- {letify-2.4.5 → letify-2.4.6}/PKG-INFO +1 -1
- {letify-2.4.5 → letify-2.4.6}/letify/__init__.py +1 -1
- {letify-2.4.5 → letify-2.4.6}/letify/runtime/bootstrap.py +11 -0
- {letify-2.4.5 → letify-2.4.6}/letify/runtime/session.py +11 -2
- {letify-2.4.5 → letify-2.4.6}/letify-core/Cargo.lock +3 -3
- {letify-2.4.5 → letify-2.4.6}/letify-core/Cargo.toml +1 -1
- {letify-2.4.5 → letify-2.4.6}/letify-ext/package-lock.json +2 -2
- {letify-2.4.5 → letify-2.4.6}/letify-ext/package.json +1 -1
- {letify-2.4.5 → letify-2.4.6}/pyproject.toml +1 -1
- {letify-2.4.5 → letify-2.4.6}/tests/test_kaggle.py +45 -0
- {letify-2.4.5 → letify-2.4.6}/.github/workflows/ci.yml +0 -0
- {letify-2.4.5 → letify-2.4.6}/.github/workflows/docs.yml +0 -0
- {letify-2.4.5 → letify-2.4.6}/.github/workflows/publish.yml +0 -0
- {letify-2.4.5 → letify-2.4.6}/.gitignore +0 -0
- {letify-2.4.5 → letify-2.4.6}/.researchtree +0 -0
- {letify-2.4.5 → letify-2.4.6}/LICENSE +0 -0
- {letify-2.4.5 → letify-2.4.6}/README.md +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/01-getting-started.md +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/02-providers.md +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/03-execution-modes.md +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/04-environments-and-data.md +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/05-concurrency.md +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/06-cost.md +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/07-troubleshooting.md +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/08-releasing.md +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/README.md +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/ko/01-/354/213/234/354/236/221/355/225/230/352/270/260.md" +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/ko/02-/355/224/204/353/241/234/353/260/224/354/235/264/353/215/224.md" +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/ko/03-/354/213/244/355/226/211-/353/260/251/354/213/235.md" +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/ko/04-/355/231/230/352/262/275/352/263/274-/353/215/260/354/235/264/355/204/260.md" +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/ko/05-/353/217/231/354/213/234-/354/213/244/355/226/211.md" +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/ko/06-/353/271/204/354/232/251.md" +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/ko/07-/353/254/270/354/240/234-/355/225/264/352/262/260.md" +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/ko/08-/353/246/264/353/246/254/354/212/244.md" +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/guide/ko/README.md +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/locales/README_ko.md +0 -0
- {letify-2.4.5 → letify-2.4.6}/docs/mkdocs.yml +0 -0
- {letify-2.4.5 → letify-2.4.6}/examples/README.md +0 -0
- {letify-2.4.5 → letify-2.4.6}/examples/nvfp4-lora/.letify.example +0 -0
- {letify-2.4.5 → letify-2.4.6}/examples/nvfp4-lora/00_smoke.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/examples/nvfp4-lora/01_sweep.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/examples/nvfp4-lora/02_resume.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/examples/nvfp4-lora/03_watch.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/examples/nvfp4-lora/README.md +0 -0
- {letify-2.4.5 → letify-2.4.6}/examples/nvfp4-lora/README_ko.md +0 -0
- {letify-2.4.5 → letify-2.4.6}/examples/nvfp4-lora/common.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/examples/nvfp4-lora/recipe.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/cli.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/config/__init__.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/config/inventory.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/config/login.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/config/schema.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/config/secrets.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/config/writer.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/declare/__init__.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/declare/cache.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/declare/env.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/declare/function.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/declare/instance.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/declare/replicas.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/errors.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/install.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/launcher.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/paths.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/protocol/__init__.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/protocol/codec.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/protocol/driver.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/protocol/handle.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/protocol/wire.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/protocol/worker.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/providers/__init__.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/providers/base.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/providers/colab.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/providers/colab_files.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/providers/colab_keepalive.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/providers/elice.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/providers/kaggle.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/providers/kaggle_adapter.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/providers/local.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/providers/modal.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/providers/modal_adapter.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/providers/naming.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/providers/shell.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/providers/tunnel.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/providers/usage.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/remoting/__init__.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/remoting/capability.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/remoting/device/__init__.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/remoting/device/client.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/remoting/device/cuda.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/remoting/device/executor.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/remoting/device/frames.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/remoting/device/guard.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/remoting/device/tensor.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/remoting/device/trace.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/remoting/device/value.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/remoting/loader.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/remoting/probe.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/render.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/runtime/__init__.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/runtime/channel.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/runtime/lease.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/runtime/pool.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/runtime/telemetry.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/store/__init__.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/store/backends/__init__.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/store/backends/filesystem.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/store/backends/google_auth.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/store/backends/layout.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/store/backends/objects.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/store/cas.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/store/pathdata.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/store/sendorder.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/store/volume.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/stubs.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/tools.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/transport/__init__.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/transport/agent.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/transport/announce.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/transport/link.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/transport/nat.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/transport/pipeline.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/transport/portmap.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/transport/probe.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/transport/quic.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/transport/rendezvous.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/transport/setup.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/transport/sshopts.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify/transport/strategies.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/.gitignore +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/build.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/letify-agent/Cargo.toml +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/letify-agent/src/driver.rs +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/letify-agent/src/main.rs +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/letify-driver/Cargo.toml +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/letify-driver/src/client.rs +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/letify-driver/src/exports.rs +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/letify-driver/src/image.rs +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/letify-driver/src/lib.rs +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/letify-driver/src/status.rs +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/letify-driver/src/table.rs +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/letify-quic/Cargo.toml +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/letify-quic/src/main.rs +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/letify-wire/Cargo.toml +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/letify-wire/src/lib.rs +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/letify-wire/tests/throughput.rs +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-core/rust-toolchain.toml +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-ext/.vscodeignore +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-ext/LICENSE +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-ext/README.md +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-ext/media/icon.svg +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-ext/src/cli.ts +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-ext/src/extension.ts +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-ext/src/history.ts +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-ext/src/model.ts +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-ext/src/poll.ts +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-ext/src/render.ts +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-ext/test/cli.test.ts +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-ext/test/manifest.test.ts +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-ext/test/model.test.ts +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-ext/test/regressions.test.ts +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify-ext/tsconfig.json +0 -0
- {letify-2.4.5 → letify-2.4.6}/letify_providers.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/scripts/sync-main.sh +0 -0
- {letify-2.4.5 → letify-2.4.6}/scripts/version.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/conftest.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/fake_kaggle_adapter.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/fake_modal_adapter.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_cli.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_cli_output.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_colab_keepalive.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_config.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_core.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_data.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_data_streaming.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_declare.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_device.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_distributed.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_editor_sessions.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_elice.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_frames.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_install.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_kaggle_cookie.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_kaggle_link.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_link_log.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_notebook.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_parallel_placement.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_paths.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_portmap.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_protocol.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_providers.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_quic.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_remoting.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_render.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_runtime.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_ship.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_store.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_strategies.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_stubs.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_transport.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_tunnel_setup.py +0 -0
- {letify-2.4.5 → letify-2.4.6}/tests/test_version.py +0 -0
|
@@ -146,9 +146,20 @@ CARD_SOURCE = (
|
|
|
146
146
|
" pass\n"
|
|
147
147
|
# /proc can list the right cards on a session whose driver cannot be used, and the
|
|
148
148
|
# first .to('cuda') then raises minutes into the call. Spec "Kaggle".
|
|
149
|
+
# cuInit is the call CUDA initialization makes, so it answers whether the driver
|
|
150
|
+
# works rather than standing in for it: a live session had the cards and the control
|
|
151
|
+
# device and still could not start CUDA. ctypes needs no torch, which the session does
|
|
152
|
+
# not have yet at this point. Spec "Kaggle".
|
|
153
|
+
"__letify_cuda = -1\n"
|
|
154
|
+
"try:\n"
|
|
155
|
+
" import ctypes as _letify_ctypes\n"
|
|
156
|
+
" __letify_cuda = _letify_ctypes.CDLL('libcuda.so.1').cuInit(0)\n"
|
|
157
|
+
"except Exception:\n"
|
|
158
|
+
" pass\n"
|
|
149
159
|
"__letify_value__ = {\n"
|
|
150
160
|
" 'cards': __letify_cards,\n"
|
|
151
161
|
" 'driver': os.path.exists('/dev/nvidiactl'),\n"
|
|
162
|
+
" 'cuinit': __letify_cuda,\n"
|
|
152
163
|
"}\n"
|
|
153
164
|
)
|
|
154
165
|
|
|
@@ -720,11 +720,14 @@ class Runtime:
|
|
|
720
720
|
except Exception:
|
|
721
721
|
# Reading /proc is not worth failing a session over when it cannot be read.
|
|
722
722
|
return
|
|
723
|
-
|
|
723
|
+
if not isinstance(found, dict):
|
|
724
|
+
found = {"cards": found, "driver": True, "cuinit": 0}
|
|
724
725
|
cards = [str(card) for card in found.get("cards") or ()]
|
|
725
726
|
driver = bool(found.get("driver"))
|
|
727
|
+
cuinit = found.get("cuinit", 0)
|
|
728
|
+
started = cuinit == 0
|
|
726
729
|
matched = [card for card in cards if fragment.casefold() in card.casefold()]
|
|
727
|
-
if len(matched) == count and len(cards) == count and driver:
|
|
730
|
+
if len(matched) == count and len(cards) == count and driver and started:
|
|
728
731
|
return
|
|
729
732
|
asked = getattr(instance, "accelerator", None) or fragment
|
|
730
733
|
arrived = ", ".join(cards) if cards else "no GPU at all"
|
|
@@ -735,6 +738,12 @@ class Runtime:
|
|
|
735
738
|
f"{arrived}, and no usable driver: /dev/nvidiactl is not there, so CUDA "
|
|
736
739
|
f"cannot start"
|
|
737
740
|
)
|
|
741
|
+
elif cards and not started:
|
|
742
|
+
arrived = (
|
|
743
|
+
f"{arrived}, and a driver that does not start: cuInit returned {cuinit}, "
|
|
744
|
+
f"which is the call CUDA initialization makes, so nothing on this session "
|
|
745
|
+
f"can use those cards"
|
|
746
|
+
)
|
|
738
747
|
message = (
|
|
739
748
|
f"{self.name}: {self.provider.alias} was asked for {count} x {asked} and the "
|
|
740
749
|
f"session has {arrived}. A declaration says where a function runs, so the "
|
|
@@ -138,7 +138,7 @@ dependencies = [
|
|
|
138
138
|
|
|
139
139
|
[[package]]
|
|
140
140
|
name = "letify-agent"
|
|
141
|
-
version = "2.4.
|
|
141
|
+
version = "2.4.6"
|
|
142
142
|
dependencies = [
|
|
143
143
|
"letify-wire",
|
|
144
144
|
"libloading",
|
|
@@ -146,7 +146,7 @@ dependencies = [
|
|
|
146
146
|
|
|
147
147
|
[[package]]
|
|
148
148
|
name = "letify-driver"
|
|
149
|
-
version = "2.4.
|
|
149
|
+
version = "2.4.6"
|
|
150
150
|
dependencies = [
|
|
151
151
|
"letify-wire",
|
|
152
152
|
]
|
|
@@ -164,7 +164,7 @@ dependencies = [
|
|
|
164
164
|
|
|
165
165
|
[[package]]
|
|
166
166
|
name = "letify-wire"
|
|
167
|
-
version = "2.4.
|
|
167
|
+
version = "2.4.6"
|
|
168
168
|
|
|
169
169
|
[[package]]
|
|
170
170
|
name = "libc"
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "letify-status",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.6",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "letify-status",
|
|
9
|
-
"version": "2.4.
|
|
9
|
+
"version": "2.4.6",
|
|
10
10
|
"license": "SEE LICENSE IN LICENSE",
|
|
11
11
|
"devDependencies": {
|
|
12
12
|
"@types/node": "^18.19.0",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "letify-status",
|
|
3
3
|
"displayName": "letify Status",
|
|
4
4
|
"description": "letify quota and GPU activity in the status bar, read from the letify CLI.",
|
|
5
|
-
"version": "2.4.
|
|
5
|
+
"version": "2.4.6",
|
|
6
6
|
"publisher": "darkpyonix",
|
|
7
7
|
"license": "SEE LICENSE IN LICENSE",
|
|
8
8
|
"repository": {
|
|
@@ -1496,3 +1496,48 @@ def test_a_session_with_the_cards_and_a_driver_passes() -> None:
|
|
|
1496
1496
|
session.check_devices()
|
|
1497
1497
|
finally:
|
|
1498
1498
|
Runtime.eval = original
|
|
1499
|
+
|
|
1500
|
+
|
|
1501
|
+
def test_a_session_whose_cuinit_fails_is_refused() -> None:
|
|
1502
|
+
"""Spec "Kaggle": cuInit is the call CUDA initialization makes.
|
|
1503
|
+
|
|
1504
|
+
A live session listed both T4s and had /dev/nvidiactl, and the first .cuda() still
|
|
1505
|
+
raised "Found no NVIDIA driver on your system" after 30 GB of shards had been sent.
|
|
1506
|
+
"""
|
|
1507
|
+
from letify.errors import InsufficientDevices
|
|
1508
|
+
from letify.runtime.session import Runtime
|
|
1509
|
+
|
|
1510
|
+
provider = kaggle_provider()
|
|
1511
|
+
session = object.__new__(Runtime)
|
|
1512
|
+
session.name = "letify-t4-fc7e27"
|
|
1513
|
+
session.provider = provider
|
|
1514
|
+
session.instance = type("I", (), {"gpu": "T4", "accelerator": "T4"})()
|
|
1515
|
+
answer = {"cards": ["Tesla T4", "Tesla T4"], "driver": True, "cuinit": 100}
|
|
1516
|
+
monkey = lambda self, source, timeout=None: answer # noqa: E731
|
|
1517
|
+
Runtime.eval, original = monkey, Runtime.eval
|
|
1518
|
+
try:
|
|
1519
|
+
with pytest.raises(InsufficientDevices) as failure:
|
|
1520
|
+
session.check_devices()
|
|
1521
|
+
finally:
|
|
1522
|
+
Runtime.eval = original
|
|
1523
|
+
message = str(failure.value)
|
|
1524
|
+
assert "cuInit" in message
|
|
1525
|
+
assert "100" in message
|
|
1526
|
+
|
|
1527
|
+
|
|
1528
|
+
def test_a_session_whose_cuinit_succeeds_passes() -> None:
|
|
1529
|
+
"""Spec: zero from cuInit is what CUDA starting looks like."""
|
|
1530
|
+
from letify.runtime.session import Runtime
|
|
1531
|
+
|
|
1532
|
+
provider = kaggle_provider()
|
|
1533
|
+
session = object.__new__(Runtime)
|
|
1534
|
+
session.name = "letify-t4-ok"
|
|
1535
|
+
session.provider = provider
|
|
1536
|
+
session.instance = type("I", (), {"gpu": "T4", "accelerator": "T4"})()
|
|
1537
|
+
answer = {"cards": ["Tesla T4", "Tesla T4"], "driver": True, "cuinit": 0}
|
|
1538
|
+
monkey = lambda self, source, timeout=None: answer # noqa: E731
|
|
1539
|
+
Runtime.eval, original = monkey, Runtime.eval
|
|
1540
|
+
try:
|
|
1541
|
+
session.check_devices()
|
|
1542
|
+
finally:
|
|
1543
|
+
Runtime.eval = original
|
|
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
|
{letify-2.4.5 → letify-2.4.6}/docs/guide/ko/01-/354/213/234/354/236/221/355/225/230/352/270/260.md"
RENAMED
|
File without changes
|
|
File without changes
|
{letify-2.4.5 → letify-2.4.6}/docs/guide/ko/03-/354/213/244/355/226/211-/353/260/251/354/213/235.md"
RENAMED
|
File without changes
|
|
File without changes
|
{letify-2.4.5 → letify-2.4.6}/docs/guide/ko/05-/353/217/231/354/213/234-/354/213/244/355/226/211.md"
RENAMED
|
File without changes
|
|
File without changes
|
{letify-2.4.5 → letify-2.4.6}/docs/guide/ko/07-/353/254/270/354/240/234-/355/225/264/352/262/260.md"
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
|
|
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
|
|
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
|