|
| 1 | +# Recommended Post-Installation Configuration |
| 2 | + |
| 3 | +<!-- toc --> |
| 4 | + |
| 5 | +- [Prerequisites: Shared Storage](#prerequisites-shared-storage) |
| 6 | +- [Dedicated Plugins Mode](#dedicated-plugins-mode) |
| 7 | +- [Delegated Operators](#delegated-operators) |
| 8 | + - [On-Demand Delegated Operators](#on-demand-delegated-operators) |
| 9 | +- [GPU Workloads (Optional)](#gpu-workloads-optional) |
| 10 | + - [Multiple Orchestrators](#multiple-orchestrators) |
| 11 | +- [Advanced: Custom Job Priorities](#advanced-custom-job-priorities) |
| 12 | +- [Verifying Your Setup](#verifying-your-setup) |
| 13 | +- [Getting Started with Plugins](#getting-started-with-plugins) |
| 14 | + |
| 15 | +<!-- tocstop --> |
| 16 | + |
| 17 | +After completing the base Helm installation, we recommend enabling the |
| 18 | +following features for a production-ready FiftyOne Enterprise deployment: |
| 19 | + |
| 20 | +1. [Prerequisites](#prerequisites-shared-storage) |
| 21 | +1. [Dedicated Plugins Mode](#dedicated-plugins-mode) |
| 22 | +1. [Delegated Operators](#delegated-operators) |
| 23 | +1. [GPU Workloads (Optional)](#gpu-workloads-optional) |
| 24 | + |
| 25 | +The default installation uses **built-in plugins** and |
| 26 | +has **no delegated operator workers**. |
| 27 | +While sufficient to get started, it limits the ability to install custom |
| 28 | +plugins and run long-running or compute-heavy tasks in the background. |
| 29 | + |
| 30 | +--- |
| 31 | + |
| 32 | +## Prerequisites: Shared Storage |
| 33 | + |
| 34 | +Dedicated plugins and delegated operators share a common plugin directory |
| 35 | +backed by a Kubernetes PersistentVolume (PV) and PersistentVolumeClaim (PVC). |
| 36 | + |
| 37 | +If you do not already have shared storage configured, refer to |
| 38 | +[Adding Shared Storage for FiftyOne Enterprise Plugins](./plugins-storage.md) |
| 39 | +for steps on creating a PV and PVC. |
| 40 | + |
| 41 | +The examples below assume: |
| 42 | + |
| 43 | +- PVC name: `plugins-pvc` |
| 44 | +- Plugin directory: `/opt/plugins` |
| 45 | + |
| 46 | +--- |
| 47 | + |
| 48 | +## Dedicated Plugins Mode |
| 49 | + |
| 50 | +By default, plugins run inside the `fiftyone-app` pod (built-in only mode). |
| 51 | +We recommend enabling **dedicated plugins mode**, which runs plugins in their |
| 52 | +own dedicated `teams-plugins` pod. This provides: |
| 53 | + |
| 54 | +- **Custom plugin support** — install plugins from the |
| 55 | + [FiftyOne Plugin Library](https://github.com/voxel51/fiftyone-plugins) or |
| 56 | + build your own |
| 57 | +- **Resource isolation** — plugin workloads do not affect `fiftyone-app` |
| 58 | + stability or performance |
| 59 | +- **Custom dependency support** — plugins with heavy ML dependencies (e.g. |
| 60 | + `transformers`) are isolated from the main app |
| 61 | + |
| 62 | +There are three plugin modes available: |
| 63 | + |
| 64 | +| Mode | Description | |
| 65 | +| --- | --- | |
| 66 | +| Built-in Only (default) | Only built-in plugins shipped with FiftyOne Enterprise | |
| 67 | +| Shared | Custom plugins run inside `fiftyone-app` — may starve the app | |
| 68 | +| **Dedicated (recommended)** | Custom plugins run in a dedicated `teams-plugins` pod | |
| 69 | + |
| 70 | +To enable dedicated plugins, add the following to your `values.yaml`: |
| 71 | + |
| 72 | +```yaml |
| 73 | +# Dedicated plugins pod |
| 74 | +pluginsSettings: |
| 75 | + enabled: true |
| 76 | + env: |
| 77 | + FIFTYONE_PLUGINS_DIR: /opt/plugins |
| 78 | + |
| 79 | +# teams-api also requires access to the plugins directory |
| 80 | +apiSettings: |
| 81 | + env: |
| 82 | + FIFTYONE_PLUGINS_DIR: /opt/plugins |
| 83 | +``` |
| 84 | +
|
| 85 | +Then apply the changes: |
| 86 | +
|
| 87 | +```bash |
| 88 | +helm upgrade fiftyone-teams-app voxel51/fiftyone-teams-app \ |
| 89 | + --values values.yaml \ |
| 90 | + --namespace <your-namespace> |
| 91 | +``` |
| 92 | + |
| 93 | +Verify the `teams-plugins` pod is running: |
| 94 | + |
| 95 | +```bash |
| 96 | +kubectl get pods --namespace <your-namespace> | grep teams-plugins |
| 97 | +``` |
| 98 | + |
| 99 | +For more details, see |
| 100 | +[Configuring Plugins](./configuring-plugins.md). |
| 101 | + |
| 102 | +--- |
| 103 | + |
| 104 | +## Delegated Operators |
| 105 | + |
| 106 | +Delegated operators allow long-running or compute-heavy tasks (such as |
| 107 | +computing embeddings, running model evaluations, importing datasets, or |
| 108 | +annotation workflows) to be scheduled from the FiftyOne UI and executed in |
| 109 | +the background on dedicated compute workers. |
| 110 | + |
| 111 | +To enable delegated operators with dedicated plugins, add the following to |
| 112 | +your `values.yaml`: |
| 113 | + |
| 114 | +```yaml |
| 115 | +delegatedOperatorDeployments: |
| 116 | + deployments: |
| 117 | + teamsDo: |
| 118 | + replicaCount: 3 # adjust based on your concurrency needs |
| 119 | + env: |
| 120 | + FIFTYONE_PLUGINS_DIR: /opt/plugins |
| 121 | + volumes: |
| 122 | + - name: plugins-vol |
| 123 | + persistentVolumeClaim: |
| 124 | + claimName: plugins-pvc |
| 125 | + readOnly: true |
| 126 | + volumeMounts: |
| 127 | + - name: plugins-vol |
| 128 | + mountPath: /opt/plugins |
| 129 | +``` |
| 130 | +
|
| 131 | +Then apply the changes: |
| 132 | +
|
| 133 | +```bash |
| 134 | +helm upgrade fiftyone-teams-app voxel51/fiftyone-teams-app \ |
| 135 | + --values values.yaml \ |
| 136 | + --namespace <your-namespace> |
| 137 | +``` |
| 138 | + |
| 139 | +Verify the `teams-do` pod is running: |
| 140 | + |
| 141 | +```bash |
| 142 | +kubectl get pods --namespace <your-namespace> | grep teams-do |
| 143 | +``` |
| 144 | + |
| 145 | +For full configuration options, see |
| 146 | +[Configuring Delegated Operators](./configuring-delegated-operators.md). |
| 147 | + |
| 148 | +### On-Demand Delegated Operators |
| 149 | + |
| 150 | +As an alternative to always-on workers, FiftyOne Enterprise v2.11.0+ supports |
| 151 | +**on-demand delegated operators** that spin up compute pods only when a job is |
| 152 | +scheduled, and tear them down when complete. |
| 153 | +This is more cost-efficient for infrequent or GPU-intensive workloads. |
| 154 | + |
| 155 | +See |
| 156 | +[Configuring On-Demand Orchestrator](../../docs/configuring-on-demand-orchestrator.md) |
| 157 | +for setup instructions. |
| 158 | + |
| 159 | +--- |
| 160 | + |
| 161 | +## GPU Workloads (Optional) |
| 162 | + |
| 163 | +If your team runs GPU-accelerated tasks (e.g. computing embeddings with |
| 164 | +`@voxel51/brain`, model evaluation, or custom ML operators), you can schedule |
| 165 | +`teams-do` pods on GPU-enabled nodes using `nodeSelector` and `tolerations`. |
| 166 | + |
| 167 | +Add the following to your `delegatedOperatorDeployments.deployments.teamsDo` |
| 168 | +config in `values.yaml`: |
| 169 | + |
| 170 | +```yaml |
| 171 | +delegatedOperatorDeployments: |
| 172 | + deployments: |
| 173 | + teamsDo: |
| 174 | + nodeSelector: |
| 175 | + <your-gpu-node-label-key>: <your-gpu-node-label-value> |
| 176 | + # e.g. node-type: gpu |
| 177 | + tolerations: |
| 178 | + - key: "nvidia.com/gpu" |
| 179 | + operator: "Exists" |
| 180 | + effect: "NoSchedule" |
| 181 | + resources: |
| 182 | + limits: |
| 183 | + nvidia.com/gpu: 1 |
| 184 | + requests: |
| 185 | + nvidia.com/gpu: 1 |
| 186 | +``` |
| 187 | +
|
| 188 | +For full details, see |
| 189 | +[Configuring GPU Workloads](./configuring-gpu-workloads.md). |
| 190 | +
|
| 191 | +### Multiple Orchestrators |
| 192 | +
|
| 193 | +For deployments with mixed workloads, you may |
| 194 | +register multiple delegated operator orchestrators. |
| 195 | +For example, one targeting GPU nodes and one targeting CPU nodes. |
| 196 | +You may run specific operators to the appropriate |
| 197 | +orchestrator from the FiftyOne UI. |
| 198 | +
|
| 199 | +```yaml |
| 200 | +delegatedOperatorDeployments: |
| 201 | + deployments: |
| 202 | + teamsDoGpu: |
| 203 | + replicaCount: 1 |
| 204 | + env: |
| 205 | + FIFTYONE_PLUGINS_DIR: /opt/plugins |
| 206 | + nodeSelector: |
| 207 | + node-type: gpu |
| 208 | + tolerations: |
| 209 | + - key: "nvidia.com/gpu" |
| 210 | + operator: "Exists" |
| 211 | + effect: "NoSchedule" |
| 212 | + resources: |
| 213 | + limits: |
| 214 | + nvidia.com/gpu: 1 |
| 215 | + volumes: |
| 216 | + - name: plugins-vol |
| 217 | + persistentVolumeClaim: |
| 218 | + claimName: plugins-pvc |
| 219 | + readOnly: true |
| 220 | + volumeMounts: |
| 221 | + - name: plugins-vol |
| 222 | + mountPath: /opt/plugins |
| 223 | + |
| 224 | + teamsDoCpu: |
| 225 | + replicaCount: 2 |
| 226 | + env: |
| 227 | + FIFTYONE_PLUGINS_DIR: /opt/plugins |
| 228 | + volumes: |
| 229 | + - name: plugins-vol |
| 230 | + persistentVolumeClaim: |
| 231 | + claimName: plugins-pvc |
| 232 | + readOnly: true |
| 233 | + volumeMounts: |
| 234 | + - name: plugins-vol |
| 235 | + mountPath: /opt/plugins |
| 236 | +``` |
| 237 | +
|
| 238 | +--- |
| 239 | +
|
| 240 | +## Advanced: Custom Job Priorities |
| 241 | +
|
| 242 | +> **Note:** The Helm chart's `delegatedOperatorJobTemplates.jobs` does not |
| 243 | +> currently support `priorityClassName` natively. |
| 244 | +> To use Kubernetes |
| 245 | +> [PriorityClasses](https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/) |
| 246 | +> with delegated operator jobs (for example, to prevent DO workloads from |
| 247 | +> contending with user-facing pods), define custom Jinja2 job templates via a |
| 248 | +> ConfigMap and register them using the |
| 249 | +> [FiftyOne Management SDK](https://docs.voxel51.com/enterprise/management_sdk.html). |
| 250 | + |
| 251 | +See |
| 252 | +[Configuring On-Demand Orchestrator](../../docs/configuring-on-demand-orchestrator.md) |
| 253 | +for details on custom job templates. |
| 254 | + |
| 255 | +--- |
| 256 | + |
| 257 | +## Verifying Your Setup |
| 258 | + |
| 259 | +After applying all changes, verify that all expected pods are running: |
| 260 | + |
| 261 | +```bash |
| 262 | +kubectl get pods --namespace <your-namespace> |
| 263 | +``` |
| 264 | + |
| 265 | +You should see: |
| 266 | + |
| 267 | +- `teams-plugins-*` — dedicated plugins pod |
| 268 | +- `teams-do-*` (one or more) — delegated operator worker pod(s) |
| 269 | + |
| 270 | +You can also verify delegated operator registration from the FiftyOne Python |
| 271 | +SDK: |
| 272 | + |
| 273 | +```python |
| 274 | +import fiftyone.operators.orchestrator as foo |
| 275 | +
|
| 276 | +orc_svc = foo.OrchestratorService() |
| 277 | +for orc in orc_svc.list(): |
| 278 | + print("{} \"{}\" {}".format(orc.instance_id, orc.description, orc.id)) |
| 279 | +``` |
| 280 | + |
| 281 | +--- |
| 282 | + |
| 283 | +## Getting Started with Plugins |
| 284 | + |
| 285 | +Once dedicated plugins are enabled, you can install community plugins from the |
| 286 | +[FiftyOne Plugin Library](https://github.com/voxel51/fiftyone-plugins) |
| 287 | +or the |
| 288 | +[FiftyOne Docs](https://docs.voxel51.com/plugins/index.html). |
| 289 | + |
| 290 | +We recommend starting with these plugins: |
| 291 | + |
| 292 | +- [`@voxel51/brain`](https://github.com/voxel51/fiftyone-plugins/tree/main/plugins/brain) |
| 293 | + — compute embeddings and similarity indexes |
| 294 | +- [`@voxel51/annotation`](https://github.com/voxel51/fiftyone-plugins/tree/main/plugins/annotation) |
| 295 | + — annotation workflows |
| 296 | +- [`@voxel51/evaluation`](https://github.com/voxel51/fiftyone-plugins/tree/main/plugins/evaluation) |
| 297 | + — model evaluation panels |
| 298 | +- [`@voxel51/zoo`](https://github.com/voxel51/fiftyone-plugins/tree/main/plugins/zoo) |
| 299 | + — access the FiftyOne Model Zoo |
| 300 | + |
| 301 | +To use plugins with custom dependencies (e.g. `transformers`), build and use |
| 302 | +[Custom Plugin Images](https://github.com/voxel51/fiftyone-teams-app-deploy/blob/main/docs/custom-plugins.md). |
0 commit comments