sciveo 0.2.76__tar.gz → 0.2.78__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.
- {sciveo-0.2.76/sciveo.egg-info → sciveo-0.2.78}/PKG-INFO +70 -19
- {sciveo-0.2.76 → sciveo-0.2.78}/README.md +69 -18
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/iam/access.py +10 -1
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/__init__.py +2 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/artifact.py +75 -8
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/model.py +547 -48
- sciveo-0.2.78/sciveo/ml/images/sciveyolo/runtime_stats.py +168 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/iam.py +14 -13
- sciveo-0.2.78/sciveo/version.py +2 -0
- {sciveo-0.2.76 → sciveo-0.2.78/sciveo.egg-info}/PKG-INFO +70 -19
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo.egg-info/SOURCES.txt +1 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_iam.py +12 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_ml_sciveyolo.py +361 -9
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_storage_iam.py +177 -0
- sciveo-0.2.76/sciveo/version.py +0 -2
- {sciveo-0.2.76 → sciveo-0.2.78}/MANIFEST.in +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/pyproject.toml +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/admin/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/admin/cli.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/admin/config.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/admin/device.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/admin/network.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/admin/server.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/base.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/cli.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/clients/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/clients/anthropic.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/clients/gemini.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/clients/groq.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/clients/hf.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/clients/ollama.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/clients/openai.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/configurations/coder.md +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/configurations/ops.md +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/configurations/researcher.md +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/configurations/reviewer.md +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/configurations/tester.md +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/console.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/media.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/orchestration.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/render.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/runtime.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/specialization.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/tools/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/tools/images.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/tools/os.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/agents/tools/web.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/api/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/api/base.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/api/cli.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/api/predictors.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/api/server.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/api/upload.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/certification/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/certification/cli.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/certification/evaluator.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/certification/profiles.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/certification/renderer.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/certification/scenarios.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/chat/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/chat/cli.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/chat/client.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/chat/crypto.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/chat/protocol.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/chat/server.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/chat/store.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/chat/ui.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/cli.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/common/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/common/configuration.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/common/model.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/common/optimizers.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/common/sampling.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/content/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/content/dataset.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/content/experiment.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/content/project.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/content/runner.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/db/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/db/read_table.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/extensions/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/extensions/assets/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/extensions/assets/vscode-sciveo-0.1.0.vsix +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/extensions/catalog.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/extensions/cli.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/help.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/iam/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/iam/identity.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/iam/policy.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/log.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/logger.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/cam.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/draw.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/asteroid.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/base_move.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/circle.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/game.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/geometrics.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/gravity_ball.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/laser.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/rocket.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/space_asteroids.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/games/asteroids/volume_bar.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/gst_server.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/motion_detection.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/nvr.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/readers.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/rpi.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/capture/rtsp.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/cli.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/base.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/encoders/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/encoders/base.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/encoders/normalizer.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/nlp/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/nlp/search.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/time_series/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/time_series/dataset.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/time_series/predictor.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/time_series/trainer.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/ml/time_series/window_generator.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/base.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/job_daemon.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/layouts/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/layouts/base.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/local.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/pipeline.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/postprocessors/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/postprocessors/base.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/postprocessors/default.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/audio/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/audio/audio.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/audio/audio_extractor_process.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/aws.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/base.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/file/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/file/archive.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/album.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/album_in_image.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/depth_esimation.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/embeddings.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/filters.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/generators.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/histogram.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/mask.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/object_detection.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/resize.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/segmentation.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/image/watermark.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/media_info.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/nlp/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/nlp/address.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/qr.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/sci/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/sci/base.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/sci/dataset.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/sci/time_series/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/sci/time_series/predictor.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/sci/time_series/trainer.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/tpu_base.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/video/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/video/generators.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/video/motion_detection.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/video/resize.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/video/video_album.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/video/video_frames.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/processors/video/video_resample.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/queues.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/server.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/web/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/pipelines/web/server.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/tools/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/media/tools/video_interactive.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/base.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/dataset/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/dataset/object_detection.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/energy/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/energy/optimization.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/energy/solar.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/evaluation/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/evaluation/markdown.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/evaluation/object_detection.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/base.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/description.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/embeddings.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/object_detection.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/engines.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/evaluate.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/results.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/runtime.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/torch_net.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/train.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/train_checkpoint.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/train_data.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/train_loss.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/sciveyolo/train_validate.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/tools.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/images/transformers.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/nlp/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/nlp/embeddings.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/nlp/tokenizers/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/nlp/tokenizers/bpe.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/video/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ml/video/description.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/cli.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/monitor.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/plant/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/plant/ems300.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/plant/sim.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/plant/tools.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/power.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/start.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/watchdog/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/watchdog/base.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/watchdog/gateway.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/watchdog/network.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/watchdog/privileged.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/watchdog/process.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/monitoring/watchdog/repair.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/camera.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/cli.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/health.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/http_server.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/http_tools.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/interfaces.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/l2.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/modbus/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/modbus/discovery.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/modbus/server.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/modbus/tools.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/mqtt.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/mqtt_server.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/sniffer.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/snmp/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/snmp/oids.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/snmp/server.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/snmp/snapshot.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/snmp/tools.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/ssh.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/network/tools.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/notifications/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/notifications/base.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/notifications/slack.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/notifications/telegram.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/notifications/viber.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ops/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ops/cli.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ops/doctor.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/ops/fleet.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/auth.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cli.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/client.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/config.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/controller.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/gateway.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/metadata.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/node.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/placement.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/protocol.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/repair.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cluster/server.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/config.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/cors.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/filesystem.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/local.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/metadata.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/mutation.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/policy.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/process.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/runtime.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/s3.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/server.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/storage/sync.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/array.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/aws/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/aws/priority_queue.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/aws/s3.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/cli.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/common.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/complexity.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/compress.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/configuration.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/crypto.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/daemon.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/draw/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/draw/contours.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/formating.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/hardware.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/http.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/logger.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/logggin.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/os.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/queue.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/random.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/remote.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/simple_counter.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/sorting.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/synchronized.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/timers.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/tools/totp.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/web/__init__.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo/web/common.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo.egg-info/dependency_links.txt +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo.egg-info/entry_points.txt +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo.egg-info/requires.txt +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/sciveo.egg-info/top_level.txt +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/setup.cfg +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/setup.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_admin.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_agents.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_agents_image_integration.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_agents_orchestration.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_api_client.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_certification.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_chat.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_cli_delegation.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_cli_modules.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_complexity.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_compress.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_configuration.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_crypto.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_eval_markdown.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_extensions_catalog.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_help.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_l2.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_log.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_media_cli.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_ml_datasets.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_ml_energy.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_modbus.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_monitor_http.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_monitoring.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_network_health.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_network_interfaces.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_notifications.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_ops_doctor_fleet.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_protocol_emulators_integration.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_protocol_io.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_runner.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_sampling.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_snmp.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_sorting.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_ssh.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_storage.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_storage_auth_hardening.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_storage_cluster.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_storage_cors.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_storage_metadata_hardening.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_tokenizers.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_totp.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_watchdog_gateway.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_watchdog_network.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_watchdog_privileged.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_watchdog_repair.py +0 -0
- {sciveo-0.2.76 → sciveo-0.2.78}/test/test_watchdog_service.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sciveo
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.78
|
|
4
4
|
Description-Content-Type: text/markdown
|
|
5
5
|
Provides-Extra: mon
|
|
6
6
|
Provides-Extra: agent
|
|
@@ -933,32 +933,80 @@ SCIVEYOLO.build("detector.pt", "detector-trt.sciveyolo", engine="trt")
|
|
|
933
933
|
```
|
|
934
934
|
|
|
935
935
|
This creates an ONNX payload marked for TensorRT; it does not contain a
|
|
936
|
-
compiled TensorRT engine.
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
936
|
+
compiled TensorRT engine. New TRT artifacts also embed a native PT fallback,
|
|
937
|
+
including its verified state and architecture metadata. Loading an artifact
|
|
938
|
+
never starts a TensorRT build by default. Sciveo tries every compatible cached
|
|
939
|
+
TensorRT profile for the incoming tensor shape, then uses the configured
|
|
940
|
+
fallback. The default is `pt`; `onnx` and `error` are explicit alternatives:
|
|
941
941
|
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
942
|
+
```python
|
|
943
|
+
model = SCIVEYOLO("detector-trt.sciveyolo", device="cuda:0", trt_fallback="pt")
|
|
944
|
+
model = SCIVEYOLO("detector-trt.sciveyolo", device="cuda:0", trt_fallback="onnx")
|
|
945
|
+
model = SCIVEYOLO("detector-trt.sciveyolo", device="cuda:0", trt_fallback="error")
|
|
946
|
+
```
|
|
947
|
+
|
|
948
|
+
For an older TRT artifact without an embedded PT state, point to a prebuilt PT
|
|
949
|
+
artifact. A raw checkpoint is intentionally rejected because fallback setup
|
|
950
|
+
must not trigger conversion:
|
|
945
951
|
|
|
946
952
|
```python
|
|
947
953
|
model = SCIVEYOLO(
|
|
954
|
+
"detector-trt.sciveyolo",
|
|
955
|
+
device="cuda:0",
|
|
956
|
+
trt_fallback="pt",
|
|
957
|
+
trt_fallback_model="detector-pt.sciveyolo",
|
|
958
|
+
)
|
|
959
|
+
```
|
|
960
|
+
|
|
961
|
+
The equivalent environment options are `SCIVEO_SCIVEYOLO_TRT_FALLBACK` and
|
|
962
|
+
`SCIVEO_SCIVEYOLO_TRT_FALLBACK_PATH`.
|
|
963
|
+
|
|
964
|
+
TensorRT compilation must be explicitly allowed and should run outside the
|
|
965
|
+
production workers. Build the observed batch/image profiles in a one-off
|
|
966
|
+
process:
|
|
967
|
+
|
|
968
|
+
```python
|
|
969
|
+
builder = SCIVEYOLO(
|
|
948
970
|
"detector-trt.sciveyolo",
|
|
949
971
|
device="cuda:0",
|
|
950
972
|
engine="trt",
|
|
951
973
|
allow_trt_build=True,
|
|
952
974
|
)
|
|
975
|
+
builder.compile_trt_profiles([
|
|
976
|
+
{"batch": 16, "imgsz": [320, 640]},
|
|
977
|
+
{"batch": 32, "imgsz": [320, 640]},
|
|
978
|
+
])
|
|
979
|
+
```
|
|
980
|
+
|
|
981
|
+
Each shape gets an independent context under `profiles/`, with a verified
|
|
982
|
+
manifest recording the exact NCHW profile. A cross-process lock prevents
|
|
983
|
+
concurrent builders from writing the same cache. Production processes omit
|
|
984
|
+
`allow_trt_build`; `engine="trt"` by itself is always cache-only. They can load
|
|
985
|
+
multiple validated contexts, choose one per batch, and apply the fallback for
|
|
986
|
+
missing or rejected profiles. Partial, legacy engine-only, and invalid contexts
|
|
987
|
+
are never rebuilt implicitly.
|
|
988
|
+
|
|
989
|
+
`allow_trt_build=True` grants permission to `compile_trt_profiles()` but does
|
|
990
|
+
not make `predict()` compile. Ad-hoc build-on-prediction behavior requires the
|
|
991
|
+
additional explicit `trt_build_on_predict=True` option (or
|
|
992
|
+
`SCIVEO_SCIVEYOLO_TRT_BUILD_ON_PREDICT=1`) and is not intended for production
|
|
993
|
+
workers.
|
|
994
|
+
|
|
995
|
+
Inspect runtime coverage and rank profiles worth compiling:
|
|
996
|
+
|
|
997
|
+
```python
|
|
998
|
+
statistics = model.runtime_statistics()
|
|
999
|
+
print(statistics["trt"]["profile_hits"])
|
|
1000
|
+
print(statistics["fallback"]["profile_candidates"])
|
|
1001
|
+
|
|
1002
|
+
suggested_shapes = [item["shape"] for item in statistics["fallback"]["profile_candidates"][:3]]
|
|
1003
|
+
# Run this only in the separate builder process created above.
|
|
1004
|
+
builder.compile_trt_profiles(suggested_shapes)
|
|
953
1005
|
```
|
|
954
1006
|
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
whole-model TensorRT context without build permission; partial or invalid
|
|
959
|
-
contexts use the ONNX fallback. `engine="trt"` by itself remains cache-only,
|
|
960
|
-
and automatic engine selection may benchmark a TRT artifact without compiling
|
|
961
|
-
it because the same fallback policy applies.
|
|
1007
|
+
Statistics include TRT hit batches/images, runtime rejections, fallback
|
|
1008
|
+
batches/images and rates, reasons, per-shape counts, and loaded profile paths.
|
|
1009
|
+
Pass `reset=True` to return the current snapshot and reset the counters.
|
|
962
1010
|
|
|
963
1011
|
Build-time conversion may use a separate environment with export tooling. The
|
|
964
1012
|
production runtime only needs the dependencies required by the artifact engine,
|
|
@@ -1197,9 +1245,12 @@ Policy evaluation is deliberately small and predictable:
|
|
|
1197
1245
|
string, boolean, and null conditions follow AWS identity-policy form.
|
|
1198
1246
|
- `s3:ListBucket` applies to the bucket ARN and can restrict `s3:prefix` and
|
|
1199
1247
|
`s3:delimiter`. It is separate from object read and write permission.
|
|
1200
|
-
- `s3:GetObject` authorizes both GET and HEAD.
|
|
1201
|
-
|
|
1202
|
-
|
|
1248
|
+
- AWS-compatible `s3:GetObject` authorizes both GET and HEAD. Sciveo additionally
|
|
1249
|
+
accepts `s3:HeadObject` as a policy extension that authorizes HEAD without
|
|
1250
|
+
authorizing GET; boto3 still sends the ordinary S3 `HeadObject` request and
|
|
1251
|
+
requires no client changes. An explicit deny matching either action denies
|
|
1252
|
+
HEAD. `s3:PutObject` authorizes regular, presigned, POST, copy-destination,
|
|
1253
|
+
and multipart writes. Copy also requires `s3:GetObject` on its source. Tagging, multipart listing/abort, bucket
|
|
1203
1254
|
lifecycle, and bulk deletion retain their distinct S3 actions.
|
|
1204
1255
|
- Bucket CORS configuration uses the distinct `s3:GetBucketCORS`,
|
|
1205
1256
|
`s3:PutBucketCORS`, and `s3:DeleteBucketCORS` actions on the bucket ARN.
|
|
@@ -909,32 +909,80 @@ SCIVEYOLO.build("detector.pt", "detector-trt.sciveyolo", engine="trt")
|
|
|
909
909
|
```
|
|
910
910
|
|
|
911
911
|
This creates an ONNX payload marked for TensorRT; it does not contain a
|
|
912
|
-
compiled TensorRT engine.
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
912
|
+
compiled TensorRT engine. New TRT artifacts also embed a native PT fallback,
|
|
913
|
+
including its verified state and architecture metadata. Loading an artifact
|
|
914
|
+
never starts a TensorRT build by default. Sciveo tries every compatible cached
|
|
915
|
+
TensorRT profile for the incoming tensor shape, then uses the configured
|
|
916
|
+
fallback. The default is `pt`; `onnx` and `error` are explicit alternatives:
|
|
917
917
|
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
918
|
+
```python
|
|
919
|
+
model = SCIVEYOLO("detector-trt.sciveyolo", device="cuda:0", trt_fallback="pt")
|
|
920
|
+
model = SCIVEYOLO("detector-trt.sciveyolo", device="cuda:0", trt_fallback="onnx")
|
|
921
|
+
model = SCIVEYOLO("detector-trt.sciveyolo", device="cuda:0", trt_fallback="error")
|
|
922
|
+
```
|
|
923
|
+
|
|
924
|
+
For an older TRT artifact without an embedded PT state, point to a prebuilt PT
|
|
925
|
+
artifact. A raw checkpoint is intentionally rejected because fallback setup
|
|
926
|
+
must not trigger conversion:
|
|
921
927
|
|
|
922
928
|
```python
|
|
923
929
|
model = SCIVEYOLO(
|
|
930
|
+
"detector-trt.sciveyolo",
|
|
931
|
+
device="cuda:0",
|
|
932
|
+
trt_fallback="pt",
|
|
933
|
+
trt_fallback_model="detector-pt.sciveyolo",
|
|
934
|
+
)
|
|
935
|
+
```
|
|
936
|
+
|
|
937
|
+
The equivalent environment options are `SCIVEO_SCIVEYOLO_TRT_FALLBACK` and
|
|
938
|
+
`SCIVEO_SCIVEYOLO_TRT_FALLBACK_PATH`.
|
|
939
|
+
|
|
940
|
+
TensorRT compilation must be explicitly allowed and should run outside the
|
|
941
|
+
production workers. Build the observed batch/image profiles in a one-off
|
|
942
|
+
process:
|
|
943
|
+
|
|
944
|
+
```python
|
|
945
|
+
builder = SCIVEYOLO(
|
|
924
946
|
"detector-trt.sciveyolo",
|
|
925
947
|
device="cuda:0",
|
|
926
948
|
engine="trt",
|
|
927
949
|
allow_trt_build=True,
|
|
928
950
|
)
|
|
951
|
+
builder.compile_trt_profiles([
|
|
952
|
+
{"batch": 16, "imgsz": [320, 640]},
|
|
953
|
+
{"batch": 32, "imgsz": [320, 640]},
|
|
954
|
+
])
|
|
955
|
+
```
|
|
956
|
+
|
|
957
|
+
Each shape gets an independent context under `profiles/`, with a verified
|
|
958
|
+
manifest recording the exact NCHW profile. A cross-process lock prevents
|
|
959
|
+
concurrent builders from writing the same cache. Production processes omit
|
|
960
|
+
`allow_trt_build`; `engine="trt"` by itself is always cache-only. They can load
|
|
961
|
+
multiple validated contexts, choose one per batch, and apply the fallback for
|
|
962
|
+
missing or rejected profiles. Partial, legacy engine-only, and invalid contexts
|
|
963
|
+
are never rebuilt implicitly.
|
|
964
|
+
|
|
965
|
+
`allow_trt_build=True` grants permission to `compile_trt_profiles()` but does
|
|
966
|
+
not make `predict()` compile. Ad-hoc build-on-prediction behavior requires the
|
|
967
|
+
additional explicit `trt_build_on_predict=True` option (or
|
|
968
|
+
`SCIVEO_SCIVEYOLO_TRT_BUILD_ON_PREDICT=1`) and is not intended for production
|
|
969
|
+
workers.
|
|
970
|
+
|
|
971
|
+
Inspect runtime coverage and rank profiles worth compiling:
|
|
972
|
+
|
|
973
|
+
```python
|
|
974
|
+
statistics = model.runtime_statistics()
|
|
975
|
+
print(statistics["trt"]["profile_hits"])
|
|
976
|
+
print(statistics["fallback"]["profile_candidates"])
|
|
977
|
+
|
|
978
|
+
suggested_shapes = [item["shape"] for item in statistics["fallback"]["profile_candidates"][:3]]
|
|
979
|
+
# Run this only in the separate builder process created above.
|
|
980
|
+
builder.compile_trt_profiles(suggested_shapes)
|
|
929
981
|
```
|
|
930
982
|
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
whole-model TensorRT context without build permission; partial or invalid
|
|
935
|
-
contexts use the ONNX fallback. `engine="trt"` by itself remains cache-only,
|
|
936
|
-
and automatic engine selection may benchmark a TRT artifact without compiling
|
|
937
|
-
it because the same fallback policy applies.
|
|
983
|
+
Statistics include TRT hit batches/images, runtime rejections, fallback
|
|
984
|
+
batches/images and rates, reasons, per-shape counts, and loaded profile paths.
|
|
985
|
+
Pass `reset=True` to return the current snapshot and reset the counters.
|
|
938
986
|
|
|
939
987
|
Build-time conversion may use a separate environment with export tooling. The
|
|
940
988
|
production runtime only needs the dependencies required by the artifact engine,
|
|
@@ -1173,9 +1221,12 @@ Policy evaluation is deliberately small and predictable:
|
|
|
1173
1221
|
string, boolean, and null conditions follow AWS identity-policy form.
|
|
1174
1222
|
- `s3:ListBucket` applies to the bucket ARN and can restrict `s3:prefix` and
|
|
1175
1223
|
`s3:delimiter`. It is separate from object read and write permission.
|
|
1176
|
-
- `s3:GetObject` authorizes both GET and HEAD.
|
|
1177
|
-
|
|
1178
|
-
|
|
1224
|
+
- AWS-compatible `s3:GetObject` authorizes both GET and HEAD. Sciveo additionally
|
|
1225
|
+
accepts `s3:HeadObject` as a policy extension that authorizes HEAD without
|
|
1226
|
+
authorizing GET; boto3 still sends the ordinary S3 `HeadObject` request and
|
|
1227
|
+
requires no client changes. An explicit deny matching either action denies
|
|
1228
|
+
HEAD. `s3:PutObject` authorizes regular, presigned, POST, copy-destination,
|
|
1229
|
+
and multipart writes. Copy also requires `s3:GetObject` on its source. Tagging, multipart listing/abort, bucket
|
|
1179
1230
|
lifecycle, and bulk deletion retain their distinct S3 actions.
|
|
1180
1231
|
- Bucket CORS configuration uses the distinct `s3:GetBucketCORS`,
|
|
1181
1232
|
`s3:PutBucketCORS`, and `s3:DeleteBucketCORS` actions on the bucket ARN.
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
#
|
|
11
11
|
|
|
12
12
|
from sciveo.iam.identity import IAMIdentityStore
|
|
13
|
-
from sciveo.iam.policy import IAMAccessRequest, IAMPolicyDecision, IAMPolicyEvaluator
|
|
13
|
+
from sciveo.iam.policy import IAMAccessDenied, IAMAccessRequest, IAMPolicyDecision, IAMPolicyEvaluator
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class IAMAccessControl:
|
|
@@ -37,6 +37,15 @@ class IAMAccessControl:
|
|
|
37
37
|
return self.evaluator.require(identity, IAMAccessRequest(action, resource, context))
|
|
38
38
|
return self.evaluator.require(identity, IAMAccessRequest(action, resource, self.identity_context(identity, context)))
|
|
39
39
|
|
|
40
|
+
def require_any(self, identity, actions, resource, context=None):
|
|
41
|
+
decisions = [self.evaluate(identity, action, resource, context=context) for action in actions]
|
|
42
|
+
if any(decision.explicit_deny for decision in decisions):
|
|
43
|
+
raise IAMAccessDenied("Access denied")
|
|
44
|
+
for decision in decisions:
|
|
45
|
+
if decision.allowed:
|
|
46
|
+
return decision
|
|
47
|
+
raise IAMAccessDenied("Access denied")
|
|
48
|
+
|
|
40
49
|
@staticmethod
|
|
41
50
|
def identity_context(identity, context=None):
|
|
42
51
|
result = dict(context or {})
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
from sciveo.ml.images.sciveyolo.artifact import SCIVEYOLOArtifact
|
|
13
13
|
from sciveo.ml.images.sciveyolo.model import SCIVEYOLO
|
|
14
14
|
from sciveo.ml.images.sciveyolo.results import SCIVEYOLOBoxes, SCIVEYOLOResults, SCIVEYOLOTensor
|
|
15
|
+
from sciveo.ml.images.sciveyolo.runtime_stats import SCIVEYOLORuntimeStats
|
|
15
16
|
from sciveo.ml.images.sciveyolo.train import SCIVEYOLOTrainResult, SCIVEYOLOTrainer
|
|
16
17
|
|
|
17
18
|
__all__ = [
|
|
@@ -19,6 +20,7 @@ __all__ = [
|
|
|
19
20
|
"SCIVEYOLOArtifact",
|
|
20
21
|
"SCIVEYOLOBoxes",
|
|
21
22
|
"SCIVEYOLOResults",
|
|
23
|
+
"SCIVEYOLORuntimeStats",
|
|
22
24
|
"SCIVEYOLOTensor",
|
|
23
25
|
"SCIVEYOLOTrainResult",
|
|
24
26
|
"SCIVEYOLOTrainer",
|
|
@@ -141,6 +141,7 @@ class SCIVEYOLOArtifact:
|
|
|
141
141
|
def __init__(self, path):
|
|
142
142
|
self.path = Path(path)
|
|
143
143
|
self.model_path = self.path
|
|
144
|
+
self.fallback_model_path = None
|
|
144
145
|
self.metadata = {}
|
|
145
146
|
if self.path.suffix == self.extension:
|
|
146
147
|
try:
|
|
@@ -161,7 +162,7 @@ class SCIVEYOLOArtifact:
|
|
|
161
162
|
package_data = self._prepare_package(extracted_path)
|
|
162
163
|
if package_data is None:
|
|
163
164
|
raise ValueError(f"Could not prepare SCIVEYOLO artifact {self.path}")
|
|
164
|
-
self.metadata, self.model_path = package_data
|
|
165
|
+
self.metadata, self.model_path, self.fallback_model_path = package_data
|
|
165
166
|
|
|
166
167
|
@contextmanager
|
|
167
168
|
def locked_package(self):
|
|
@@ -171,7 +172,7 @@ class SCIVEYOLOArtifact:
|
|
|
171
172
|
extracted_path = self.path.with_name(f"{self.path.name}.unpacked")
|
|
172
173
|
with _SCIVEYOLOArtifactLock(self._lock_path()):
|
|
173
174
|
package_data = self._prepare_package(extracted_path)
|
|
174
|
-
self.metadata, self.model_path = package_data
|
|
175
|
+
self.metadata, self.model_path, self.fallback_model_path = package_data
|
|
175
176
|
yield self
|
|
176
177
|
|
|
177
178
|
def _prepare_package(self, extracted_path):
|
|
@@ -206,14 +207,26 @@ class SCIVEYOLOArtifact:
|
|
|
206
207
|
return None
|
|
207
208
|
if not self._cached_file_matches(extracted_path, marker.get("model")):
|
|
208
209
|
return None
|
|
209
|
-
metadata, model_path = self._read_extracted_package(extracted_path, verify_model_hash=False)
|
|
210
|
+
metadata, model_path, fallback_model_path = self._read_extracted_package(extracted_path, verify_model_hash=False)
|
|
210
211
|
model_filename = model_path.relative_to(Path(extracted_path).resolve()).as_posix()
|
|
211
212
|
if model_filename != marker["model"]["filename"]:
|
|
212
213
|
return None
|
|
213
214
|
expected_hash = metadata.get("model", {}).get("sha256")
|
|
214
215
|
if expected_hash and expected_hash != marker["model"]["sha256"]:
|
|
215
216
|
return None
|
|
216
|
-
|
|
217
|
+
fallback_metadata = metadata.get("fallback")
|
|
218
|
+
marker_fallback = marker.get("fallback")
|
|
219
|
+
if fallback_model_path is None:
|
|
220
|
+
if fallback_metadata is not None or marker_fallback is not None:
|
|
221
|
+
return None
|
|
222
|
+
else:
|
|
223
|
+
fallback_filename = fallback_model_path.relative_to(Path(extracted_path).resolve()).as_posix()
|
|
224
|
+
if not self._cached_file_matches(extracted_path, marker_fallback, expected_filename=fallback_filename):
|
|
225
|
+
return None
|
|
226
|
+
expected_fallback_hash = fallback_metadata.get("sha256")
|
|
227
|
+
if expected_fallback_hash and expected_fallback_hash != marker_fallback["sha256"]:
|
|
228
|
+
return None
|
|
229
|
+
return metadata, model_path, fallback_model_path
|
|
217
230
|
except (AttributeError, KeyError, OSError, TypeError, UnicodeError, ValueError, zipfile.BadZipFile):
|
|
218
231
|
return None
|
|
219
232
|
|
|
@@ -225,7 +238,7 @@ class SCIVEYOLOArtifact:
|
|
|
225
238
|
try:
|
|
226
239
|
self._create_cache_owner(partial_path)
|
|
227
240
|
self._safe_extract_package(package, partial_path)
|
|
228
|
-
metadata, model_path = self._read_extracted_package(partial_path)
|
|
241
|
+
metadata, model_path, fallback_model_path = self._read_extracted_package(partial_path)
|
|
229
242
|
metadata_path = partial_path / "metadata.json"
|
|
230
243
|
model_hash = metadata.get("model", {}).get("sha256") or self._sha256(model_path)
|
|
231
244
|
marker = {
|
|
@@ -236,6 +249,7 @@ class SCIVEYOLOArtifact:
|
|
|
236
249
|
"filename": model_path.relative_to(partial_path.resolve()).as_posix(),
|
|
237
250
|
"sha256": model_hash,
|
|
238
251
|
},
|
|
252
|
+
"fallback": self._cache_file_data(partial_path, fallback_model_path) if fallback_model_path is not None else None,
|
|
239
253
|
}
|
|
240
254
|
self._write_private_text(
|
|
241
255
|
partial_path / self.cache_marker_filename,
|
|
@@ -271,7 +285,20 @@ class SCIVEYOLOArtifact:
|
|
|
271
285
|
raise FileNotFoundError(f"SCIVEYOLO artifact does not contain a supported model file: {self.path}")
|
|
272
286
|
if verify_model_hash:
|
|
273
287
|
self._verify_model_hash(model_path=model_path, metadata=metadata)
|
|
274
|
-
|
|
288
|
+
fallback_model_path = None
|
|
289
|
+
fallback_metadata = metadata.get("fallback")
|
|
290
|
+
if fallback_metadata is not None:
|
|
291
|
+
if not isinstance(fallback_metadata, dict):
|
|
292
|
+
raise ValueError(f"SCIVEYOLO artifact fallback metadata is not an object: {self.path}")
|
|
293
|
+
fallback_filename = fallback_metadata.get("filename")
|
|
294
|
+
if not fallback_filename:
|
|
295
|
+
raise ValueError(f"SCIVEYOLO artifact fallback metadata has no filename: {self.path}")
|
|
296
|
+
fallback_model_path = self._safe_package_path(base_path, fallback_filename)
|
|
297
|
+
if not fallback_model_path.is_file() or fallback_model_path.is_symlink():
|
|
298
|
+
raise FileNotFoundError(f"SCIVEYOLO artifact fallback model is missing: {fallback_model_path}")
|
|
299
|
+
if verify_model_hash:
|
|
300
|
+
self._verify_fallback_hash(fallback_model_path, fallback_metadata)
|
|
301
|
+
return metadata, model_path, fallback_model_path
|
|
275
302
|
|
|
276
303
|
@staticmethod
|
|
277
304
|
def _package_signature(package):
|
|
@@ -420,6 +447,14 @@ class SCIVEYOLOArtifact:
|
|
|
420
447
|
if actual != expected:
|
|
421
448
|
raise ValueError(f"SCIVEYOLO artifact model hash mismatch for {self.path}")
|
|
422
449
|
|
|
450
|
+
def _verify_fallback_hash(self, fallback_model_path, fallback_metadata):
|
|
451
|
+
expected = fallback_metadata.get("sha256")
|
|
452
|
+
if not expected:
|
|
453
|
+
return
|
|
454
|
+
actual = self._sha256(fallback_model_path)
|
|
455
|
+
if actual != expected:
|
|
456
|
+
raise ValueError(f"SCIVEYOLO artifact fallback model hash mismatch for {self.path}")
|
|
457
|
+
|
|
423
458
|
@classmethod
|
|
424
459
|
def build(cls, source, output, imgsz=640, export_command=None, env=None, extra_args=None, format=None, dynamic=True, engine="pt", device=None, verbose=False):
|
|
425
460
|
engine = cls._normalize_engine(engine if format is None else format)
|
|
@@ -486,6 +521,31 @@ class SCIVEYOLOArtifact:
|
|
|
486
521
|
raise FileNotFoundError(f"SCIVEYOLO export did not create {model_path}")
|
|
487
522
|
|
|
488
523
|
metadata = cls._export_metadata(model_path)
|
|
524
|
+
fallback_model_path = None
|
|
525
|
+
fallback_metadata = None
|
|
526
|
+
if format == "trt":
|
|
527
|
+
fallback_model_path = build_path / "fallback_model_state.pt"
|
|
528
|
+
checkpoint = cls._load_pt_checkpoint(copied_source)
|
|
529
|
+
checkpoint_model = cls._checkpoint_model(checkpoint)
|
|
530
|
+
state_dict = cls._checkpoint_state_dict(checkpoint_model)
|
|
531
|
+
names = cls._checkpoint_names(checkpoint, checkpoint_model)
|
|
532
|
+
nc = len(names) if names else cls._state_dict_nc(state_dict)
|
|
533
|
+
scale = cls._checkpoint_scale(checkpoint_model)
|
|
534
|
+
cls._save_state_dict(fallback_model_path, state_dict)
|
|
535
|
+
metadata.update({
|
|
536
|
+
"scale": scale,
|
|
537
|
+
"model_size": scale,
|
|
538
|
+
"variant": f"sciveyolo{scale}",
|
|
539
|
+
"names": names,
|
|
540
|
+
"nc": nc,
|
|
541
|
+
"stride": cls._checkpoint_stride(checkpoint_model),
|
|
542
|
+
})
|
|
543
|
+
fallback_metadata = {
|
|
544
|
+
"engine": "pt",
|
|
545
|
+
"runtime": "torch-native",
|
|
546
|
+
"filename": "fallback_model_state.pt",
|
|
547
|
+
"sha256": cls._sha256(fallback_model_path),
|
|
548
|
+
}
|
|
489
549
|
runtime = {
|
|
490
550
|
"onnx": "onnxruntime",
|
|
491
551
|
"trt": "onnxruntime-tensorrt",
|
|
@@ -511,7 +571,9 @@ class SCIVEYOLOArtifact:
|
|
|
511
571
|
"sha256": cls._sha256(model_path),
|
|
512
572
|
},
|
|
513
573
|
})
|
|
514
|
-
|
|
574
|
+
if fallback_metadata is not None:
|
|
575
|
+
metadata["fallback"] = fallback_metadata
|
|
576
|
+
return cls._write_package(output, model_path, metadata, fallback_model_path=fallback_model_path)
|
|
515
577
|
|
|
516
578
|
@classmethod
|
|
517
579
|
def _build_pt(cls, source, output, imgsz=640):
|
|
@@ -555,11 +617,16 @@ class SCIVEYOLOArtifact:
|
|
|
555
617
|
return cls._write_package(output, state_path, metadata)
|
|
556
618
|
|
|
557
619
|
@classmethod
|
|
558
|
-
def _write_package(cls, output, model_path, metadata):
|
|
620
|
+
def _write_package(cls, output, model_path, metadata, fallback_model_path=None):
|
|
559
621
|
output = Path(output)
|
|
560
622
|
output.parent.mkdir(parents=True, exist_ok=True)
|
|
561
623
|
with zipfile.ZipFile(output, "w", compression=zipfile.ZIP_DEFLATED) as package:
|
|
562
624
|
package.write(model_path, metadata["model"]["filename"])
|
|
625
|
+
if fallback_model_path is not None:
|
|
626
|
+
fallback_filename = metadata.get("fallback", {}).get("filename")
|
|
627
|
+
if not fallback_filename:
|
|
628
|
+
raise ValueError("SCIVEYOLO fallback model requires metadata with a filename")
|
|
629
|
+
package.write(fallback_model_path, fallback_filename)
|
|
563
630
|
package.writestr("metadata.json", json.dumps(metadata, indent=2, sort_keys=True))
|
|
564
631
|
return str(output)
|
|
565
632
|
|