Azure.ResourceManager.WeightsAndBiases (.NET)
Azure Resource Manager SDK for deploying and managing Weights & Biases ML experiment tracking instances via Azure Marketplace.
Installation
bash
dotnet add package Azure.ResourceManager.WeightsAndBiases --prereleasedotnet add package Azure.IdentityCurrent Version: v1.0.0-beta.1 (preview)
API Version: 2024-09-18-preview
Environment Variables
bash
AZURE_SUBSCRIPTION_ID=<your-subscription-id> # Required: Azure subscription IDAZURE_RESOURCE_GROUP=<your-resource-group> # Required: Azure resource group nameAZURE_WANDB_INSTANCE_NAME=<your-wandb-instance> # Required: Weights & Biases instance nameAZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in productionAuthentication
csharp
using Azure.Identity;using Azure.ResourceManager;using Azure.ResourceManager.WeightsAndBiases;
// Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>var credential = new DefaultAzureCredential( DefaultAzureCredential.DefaultEnvironmentVariableName);// Or use a specific credential directly in production:// See https://learn.microsoft.com/dotnet/api/overview/azure/identity-readme?view=azure-dotnet#credential-classes// var credential = new ManagedIdentityCredential();ArmClient client = new ArmClient(credential);Resource Hierarchy
Subscription└── ResourceGroup └── WeightsAndBiasesInstance # W&B deployment from Azure Marketplace ├── Properties │ ├── Marketplace # Offer details, plan, publisher │ ├── User # Admin user info │ ├── PartnerProperties # W&B-specific config (region, subdomain) │ └── SingleSignOnPropertiesV2 # Entra ID SSO configuration └── Identity # Managed identity (optional)Core Workflows
1. Create Weights & Biases Instance
csharp
using Azure.ResourceManager.WeightsAndBiases;using Azure.ResourceManager.WeightsAndBiases.Models;
ResourceGroupResource resourceGroup = await client .GetDefaultSubscriptionAsync() .Result .GetResourceGroupAsync("my-resource-group");
WeightsAndBiasesInstanceCollection instances = resourceGroup.GetWeightsAndBiasesInstances();
WeightsAndBiasesInstanceData data = new WeightsAndBiasesInstanceData(AzureLocation.EastUS){ Properties = new WeightsAndBiasesInstanceProperties { // Marketplace configuration Marketplace = new WeightsAndBiasesMarketplaceDetails { SubscriptionId = "<marketplace-subscription-id>", OfferDetails = new WeightsAndBiasesOfferDetails { PublisherId = "wandb", OfferId = "wandb-pay-as-you-go", PlanId = "wandb-payg", PlanName = "Pay As You Go", TermId = "monthly", TermUnit = "P1M" } }, // Admin user User = new WeightsAndBiasesUserDetails { FirstName = "Admin", LastName = "User", EmailAddress = "[email protected]", Upn = "[email protected]" }, // W&B-specific configuration PartnerProperties = new WeightsAndBiasesPartnerProperties { Region = WeightsAndBiasesRegion.EastUS, Subdomain = "my-company-wandb" } }, // Optional: Enable managed identity Identity = new ManagedServiceIdentity(ManagedServiceIdentityType.SystemAssigned)};
ArmOperation<WeightsAndBiasesInstanceResource> operation = await instances .CreateOrUpdateAsync(WaitUntil.Completed, "my-wandb-instance", data);
WeightsAndBiasesInstanceResource instance = operation.Value;
Console.WriteLine($"W&B Instance created: {instance.Data.Name}");Console.WriteLine($"Provisioning state: {instance.Data.Properties.ProvisioningState}");2. Get Existing Instance
csharp
WeightsAndBiasesInstanceResource instance = await resourceGroup .GetWeightsAndBiasesInstanceAsync("my-wandb-instance");
Console.WriteLine($"Instance: {instance.Data.Name}");Console.WriteLine($"Location: {instance.Data.Location}");Console.WriteLine($"State: {instance.Data.Properties.ProvisioningState}");
if (instance.Data.Properties.PartnerProperties != null){ Console.WriteLine($"Region: {instance.Data.Properties.PartnerProperties.Region}"); Console.WriteLine($"Subdomain: {instance.Data.Properties.PartnerProperties.Subdomain}");}3. List All Instances
csharp
// List in resource groupawait foreach (WeightsAndBiasesInstanceResource instance in resourceGroup.GetWeightsAndBiasesInstances()){ Console.WriteLine($"Instance: {instance.Data.Name}"); Console.WriteLine($" Location: {instance.Data.Location}"); Console.WriteLine($" State: {instance.Data.Properties.ProvisioningState}");}
// List in subscriptionSubscriptionResource subscription = await client.GetDefaultSubscriptionAsync();await foreach (WeightsAndBiasesInstanceResource instance in subscription.GetWeightsAndBiasesInstancesAsync()){ Console.WriteLine($"{instance.Data.Name} in {instance.Id.ResourceGroupName}");}4. Configure Single Sign-On (SSO)
csharp
WeightsAndBiasesInstanceResource instance = await resourceGroup .GetWeightsAndBiasesInstanceAsync("my-wandb-instance");
// Update with SSO configurationWeightsAndBiasesInstanceData updateData = instance.Data;
updateData.Properties.SingleSignOnPropertiesV2 = new WeightsAndBiasSingleSignOnPropertiesV2{ Type = WeightsAndBiasSingleSignOnType.Saml, State = WeightsAndBiasSingleSignOnState.Enable, EnterpriseAppId = "<entra-app-id>", AadDomains = { "example.com", "contoso.com" }};
ArmOperation<WeightsAndBiasesInstanceResource> operation = await resourceGroup .GetWeightsAndBiasesInstances() .CreateOrUpdateAsync(WaitUntil.Completed, "my-wandb-instance", updateData);5. Update Instance
csharp
WeightsAndBiasesInstanceResource instance = await resourceGroup .GetWeightsAndBiasesInstanceAsync("my-wandb-instance");
// Update tagsWeightsAndBiasesInstancePatch patch = new WeightsAndBiasesInstancePatch{ Tags = { { "environment", "production" }, { "team", "ml-platform" }, { "costCenter", "CC-ML-001" } }};
instance = await instance.UpdateAsync(patch);Console.WriteLine($"Updated instance: {instance.Data.Name}");6. Delete Instance
csharp
WeightsAndBiasesInstanceResource instance = await resourceGroup .GetWeightsAndBiasesInstanceAsync("my-wandb-instance");
await instance.DeleteAsync(WaitUntil.Completed);Console.WriteLine("Instance deleted");7. Check Resource Name Availability
csharp
// Check if name is available before creating// (Implement via direct ARM call if SDK doesn't expose this)try{ await resourceGroup.GetWeightsAndBiasesInstanceAsync("desired-name"); Console.WriteLine("Name is already taken");}catch (RequestFailedException ex) when (ex.Status == 404){ Console.WriteLine("Name is available");}Key Types Reference
| Type | Purpose |
|---|---|
WeightsAndBiasesInstanceResource | W&B instance resource |
WeightsAndBiasesInstanceData | Instance configuration data |
WeightsAndBiasesInstanceCollection | Collection of instances |
WeightsAndBiasesInstanceProperties | Instance properties |
WeightsAndBiasesMarketplaceDetails | Marketplace subscription info |
WeightsAndBiasesOfferDetails | Marketplace offer details |
WeightsAndBiasesUserDetails | Admin user information |
WeightsAndBiasesPartnerProperties | W&B-specific configuration |
WeightsAndBiasSingleSignOnPropertiesV2 | SSO configuration |
WeightsAndBiasesInstancePatch | Patch for updates |
WeightsAndBiasesRegion | Supported regions enum |
Available Regions
| Region Enum | Azure Region |
|---|---|
WeightsAndBiasesRegion.EastUS | East US |
WeightsAndBiasesRegion.CentralUS | Central US |
WeightsAndBiasesRegion.WestUS | West US |
WeightsAndBiasesRegion.WestEurope | West Europe |
WeightsAndBiasesRegion.JapanEast | Japan East |
WeightsAndBiasesRegion.KoreaCentral | Korea Central |
Marketplace Offer Details
For Azure Marketplace integration:
| Property | Value |
|---|---|
| Publisher ID | wandb |
| Offer ID | wandb-pay-as-you-go |
| Plan ID | wandb-payg (Pay As You Go) |
Best Practices
- Use DefaultAzureCredential — Supports multiple auth methods automatically
- Enable managed identity — For secure access to other Azure resources
- Configure SSO — Enable Entra ID SSO for enterprise security
- Tag resources — Use tags for cost tracking and organization
- Check provisioning state — Wait for
Succeededbefore using instance - Use appropriate region — Choose region closest to your compute
- Monitor with Azure — Use Azure Monitor for resource health
Error Handling
csharp
using Azure;
try{ ArmOperation<WeightsAndBiasesInstanceResource> operation = await instances .CreateOrUpdateAsync(WaitUntil.Completed, "my-wandb", data);}catch (RequestFailedException ex) when (ex.Status == 409){ Console.WriteLine("Instance already exists or name conflict");}catch (RequestFailedException ex) when (ex.Status == 400){ Console.WriteLine($"Invalid configuration: {ex.Message}");}catch (RequestFailedException ex){ Console.WriteLine($"Azure error: {ex.Status} - {ex.Message}");}Integration with W&B SDK
After creating the Azure resource, use the W&B Python SDK for experiment tracking:
python
# Install: pip install wandbimport wandb
# Login with your W&B API key from the Azure-deployed instancewandb.login(host="https://my-company-wandb.wandb.ai")
# Initialize a runrun = wandb.init(project="my-ml-project")
# Log metricswandb.log({"accuracy": 0.95, "loss": 0.05})
# Finish runrun.finish()Related SDKs
| SDK | Purpose | Install |
|---|---|---|
Azure.ResourceManager.WeightsAndBiases | W&B instance management (this SDK) | dotnet add package Azure.ResourceManager.WeightsAndBiases --prerelease |
Azure.ResourceManager.MachineLearning | Azure ML workspaces | dotnet add package Azure.ResourceManager.MachineLearning |
Reference Links
| Resource | URL |
|---|---|
| NuGet Package | https://www.nuget.org/packages/Azure.ResourceManager.WeightsAndBiases |
| W&B Documentation | https://docs.wandb.ai/ |
| Azure Marketplace | https://azuremarketplace.microsoft.com/marketplace/apps/wandb.wandb-pay-as-you-go |
| GitHub Source | https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/weightsandbiases |


