Skip to content
This repository was archived by the owner on Nov 27, 2024. It is now read-only.

DX Device Detection #87

Merged
merged 2 commits into from
Jan 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion OnnxStack.UI/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public App()
builder.Services.AddTransient<UpdateUpscaleModelDialog>();
builder.Services.AddSingleton<IModelFactory, ModelFactory>();
builder.Services.AddSingleton<IDialogService, DialogService>();

builder.Services.AddSingleton<IDeviceService, DeviceService>();
// Build App
_applicationHost = builder.Build();
}
Expand Down
81 changes: 38 additions & 43 deletions OnnxStack.UI/Dialogs/UpdateModelDialog.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
xmlns:userControls="clr-namespace:OnnxStack.UI.UserControls"
mc:Ignorable="d"
Name="UI"
MinWidth="1200"
MaxWidth="1200"
Icon="/Images/Icon.png"
SizeToContent="WidthAndHeight"
WindowStartupLocation="CenterOwner"
Expand All @@ -27,16 +29,16 @@

<UniformGrid Columns="3" Margin="0,5,0,0">

<StackPanel Margin="0,0,4,0">
<StackPanel>
<TextBlock Text="Pipeline" />
<ComboBox ItemsSource="{Binding Source={StaticResource DiffuserPipelineType}}" SelectedItem="{Binding UpdateModelSet.PipelineType}" />
</StackPanel>

<StackPanel Margin="0,0,4,0">
<StackPanel Margin="4,0">
<TextBlock Text="Model Type" />
<ComboBox ItemsSource="{Binding Source={StaticResource ModelType}}" SelectedItem="{Binding UpdateModelSet.ModelType}" />
</StackPanel>
<StackPanel Margin="0,0,4,0">
<StackPanel >
<TextBlock Text="Sample Size" />
<TextBox Text="{Binding UpdateModelSet.SampleSize}" />
</StackPanel>
Expand All @@ -53,40 +55,35 @@
</GroupBox>

<GroupBox Header="Performance" Margin="5,0" >
<UniformGrid Columns="2" Margin="5">

<StackPanel Margin="0,0,4,0">
<TextBlock Text="Execution Provider" />
<ComboBox ItemsSource="{Binding UISettings.SupportedExecutionProviders}" SelectedItem="{Binding UpdateModelSet.ExecutionProvider}" />
<StackPanel Margin="5">
<StackPanel Margin="0,0,4,0">
<TextBlock Text="Device" />
<userControls:DevicePickerControl
UISettings="{Binding UISettings}"
DeviceId="{Binding UpdateModelSet.DeviceId, Mode=TwoWay}"
ExecutionProvider="{Binding UpdateModelSet.ExecutionProvider, Mode=TwoWay}" />
</StackPanel>
<TextBlock />
<StackPanel Margin="0,0,4,0">
<StackPanel Margin="0,4,0,0">
<TextBlock Text="Mode" />
<ComboBox ItemsSource="{Binding Source={StaticResource ExecutionModeType}}" SelectedItem="{Binding UpdateModelSet.ExecutionMode}" />
</StackPanel>
<StackPanel Margin="0,0,4,0">
<DockPanel>
<TextBlock DockPanel.Dock="Left" Text="DeviceId" />
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
</DockPanel>
<TextBox Text="{Binding UpdateModelSet.DeviceId}" />
</StackPanel>
<StackPanel Margin="0,0,4,0">
<DockPanel>
<TextBlock DockPanel.Dock="Left" Text="InterOp Threads" />
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
</DockPanel>
<TextBox Text="{Binding UpdateModelSet.InterOpNumThreads}" />
</StackPanel>

<StackPanel>
<DockPanel>
<TextBlock DockPanel.Dock="Left" Text="IntraOp Threads" />
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
</DockPanel>
<TextBox Text="{Binding UpdateModelSet.IntraOpNumThreads}" />
</StackPanel>
</UniformGrid>
<UniformGrid Columns="2" Margin="0,4,0,0">
<StackPanel Margin="0,0,2,0">
<DockPanel>
<TextBlock DockPanel.Dock="Left" Text="InterOp Threads" />
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
</DockPanel>
<TextBox Text="{Binding UpdateModelSet.InterOpNumThreads}" />
</StackPanel>
<StackPanel Margin="2,0,0,0">
<DockPanel>
<TextBlock DockPanel.Dock="Left" Text="IntraOp Threads" />
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
</DockPanel>
<TextBox Text="{Binding UpdateModelSet.IntraOpNumThreads}" />
</StackPanel>
</UniformGrid>
</StackPanel>
</GroupBox>

<GroupBox Header="Advanced Settings" >
Expand Down Expand Up @@ -148,22 +145,20 @@
</DockPanel>

<!--Override Defaults-->
<UniformGrid Grid.Column="0" Columns="5" Visibility="{Binding IsOverrideEnabled, Converter={StaticResource BooleanToVisibilityConverter}}" Margin="0,5,0,10">
<UniformGrid Grid.Column="0" Columns="4" Visibility="{Binding IsOverrideEnabled, Converter={StaticResource BooleanToVisibilityConverter}}" Margin="0,5,0,10">
<StackPanel Margin="0,0,4,0">
<TextBlock Text="Provider" />
<ComboBox ItemsSource="{Binding UISettings.SupportedExecutionProviders, ElementName=UI}" SelectedItem="{Binding ExecutionProvider}" />
<TextBlock Text="Device" />
<userControls:DevicePickerControl
UISettings="{Binding UISettings, ElementName=UI}"
DeviceId="{Binding DeviceId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ExecutionProvider="{Binding ExecutionProvider, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>

<StackPanel Margin="0,0,4,0">
<TextBlock Text="Mode" />
<ComboBox ItemsSource="{Binding Source={StaticResource ExecutionModeType}}" SelectedItem="{Binding ExecutionMode}" />
</StackPanel>
<StackPanel Margin="0,0,4,0">
<DockPanel>
<TextBlock DockPanel.Dock="Left" Text="DeviceId" />
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
</DockPanel>
<TextBox Text="{Binding DeviceId, TargetNullValue=''}" />
</StackPanel>

<StackPanel Margin="0,0,4,0">
<DockPanel>
<TextBlock DockPanel.Dock="Left" Text="InterOp Threads" />
Expand Down
18 changes: 8 additions & 10 deletions OnnxStack.UI/Dialogs/UpdateUpscaleModelDialog.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -74,22 +74,20 @@
<GroupBox Header="Performance" Margin="5,10,5,0" >
<UniformGrid Columns="2" Margin="5">

<StackPanel Margin="0,0,4,0">
<TextBlock Text="Execution Provider" />
<ComboBox ItemsSource="{Binding UISettings.SupportedExecutionProviders}" SelectedItem="{Binding UpdateModelSet.ExecutionProvider}" />
<StackPanel Margin="0,0,4,0">
<TextBlock Text="Device" />
<userControls:DevicePickerControl
UISettings="{Binding UISettings}"
DeviceId="{Binding UpdateModelSet.DeviceId, Mode=TwoWay}"
ExecutionProvider="{Binding UpdateModelSet.ExecutionProvider, Mode=TwoWay}" />
</StackPanel>

<TextBlock />
<StackPanel Margin="0,0,4,0">
<TextBlock Text="Mode" />
<ComboBox ItemsSource="{Binding Source={StaticResource ExecutionModeType}}" SelectedItem="{Binding UpdateModelSet.ExecutionMode}" />
</StackPanel>
<StackPanel>
<DockPanel>
<TextBlock DockPanel.Dock="Left" Text="DeviceId" />
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
</DockPanel>
<TextBox Text="{Binding UpdateModelSet.DeviceId}" />
</StackPanel>

<StackPanel Margin="0,0,4,0">
<DockPanel>
<TextBlock DockPanel.Dock="Left" Text="InterOp Threads" />
Expand Down
16 changes: 16 additions & 0 deletions OnnxStack.UI/Models/DeviceInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace OnnxStack.UI.Models
{
public class DeviceInfo
{
public DeviceInfo(string name, int deviceId, int vram)
{
Name = name;
DeviceId = deviceId;
VRAM = vram;
}

public string Name { get; set; }
public int DeviceId { get; set; }
public int VRAM { get; set; }
}
}
15 changes: 7 additions & 8 deletions OnnxStack.UI/Models/OnnxStackUIConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,28 +14,27 @@ public class OnnxStackUIConfig : IConfigSection
public int DefaultIntraOpNumThreads { get; set; }
public ExecutionMode DefaultExecutionMode { get; set; }
public ExecutionProvider DefaultExecutionProvider { get; set; }
public IEnumerable<ExecutionProvider> SupportedExecutionProviders => GetSupportedExecutionProviders();
public ExecutionProvider SupportedExecutionProvider => GetSupportedExecutionProvider();
public ObservableCollection<UpscaleModelSetViewModel> UpscaleModelSets { get; set; } = new ObservableCollection<UpscaleModelSetViewModel>();
public ObservableCollection<StableDiffusionModelSetViewModel> StableDiffusionModelSets { get; set; } = new ObservableCollection<StableDiffusionModelSetViewModel>();


public IEnumerable<ExecutionProvider> GetSupportedExecutionProviders()
public ExecutionProvider GetSupportedExecutionProvider()
{
#if DEBUG_CUDA || RELEASE_CUDA
yield return ExecutionProvider.Cuda;
return ExecutionProvider.Cuda;
#elif DEBUG_TENSORRT || RELEASE_TENSORRT
yield return ExecutionProvider.TensorRT;
return ExecutionProvider.TensorRT;
#else
yield return ExecutionProvider.DirectML;
return ExecutionProvider.DirectML;
#endif
yield return ExecutionProvider.Cpu;
}

public void Initialize()
{
DefaultExecutionProvider = SupportedExecutionProviders.Contains(DefaultExecutionProvider)
DefaultExecutionProvider = DefaultExecutionProvider == SupportedExecutionProvider || DefaultExecutionProvider == ExecutionProvider.Cpu
? DefaultExecutionProvider
: SupportedExecutionProviders.First();
: SupportedExecutionProvider;
}

}
Expand Down
Binary file added OnnxStack.UI/OnnxStack.Adapter.dll
Binary file not shown.
8 changes: 7 additions & 1 deletion OnnxStack.UI/OnnxStack.UI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<PlatformTarget>x64</PlatformTarget>
<Configurations>Debug;Release;Debug-Cuda;Debug-TensorRT;Release-Cuda;Release-TensorRT</Configurations>
<Platforms>x64</Platforms>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-Cuda|x64'">
Expand Down Expand Up @@ -39,7 +40,6 @@
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
<None Include="..\OnnxStack.Adapter\x64\Debug\OnnxStack.Adapter.dll" Link="OnnxStack.Adapter.dll" />
<Resource Include="Fonts\fa-brands-400.ttf" />
<Resource Include="Fonts\fa-duotone-900.ttf" />
<Resource Include="Fonts\fa-light-300.ttf" />
Expand Down Expand Up @@ -69,4 +69,10 @@
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.77" />
</ItemGroup>

<ItemGroup>
<None Update="OnnxStack.Adapter.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>

</Project>
113 changes: 113 additions & 0 deletions OnnxStack.UI/Services/DeviceService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
using Microsoft.Extensions.Logging;
using OnnxStack.UI.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

namespace OnnxStack.UI.Services
{
public class DeviceService : IDeviceService
{
private readonly ILogger<DeviceService> _logger;
private IReadOnlyList<DeviceInfo> _devices;

/// <summary>
/// Initializes a new instance of the <see cref="DeviceService"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
public DeviceService(ILogger<DeviceService> logger)
{
_logger = logger;
_devices = GetDevices();
}

/// <summary>
/// Gets the devices.
/// </summary>
public IReadOnlyList<DeviceInfo> Devices => _devices;


/// <summary>
/// Gets the devices.
/// </summary>
/// <returns></returns>
private IReadOnlyList<DeviceInfo> GetDevices()
{
_logger.LogInformation("[GetDevices] - Query Devices...");
var devices = new List<DeviceInfo> { new DeviceInfo("CPU", 0, 0) };

try
{
var adapters = new AdapterInfo[10];
AdapterInterop.GetAdapters(adapters);
devices.AddRange(adapters
.Where(x => x.DedicatedVideoMemory > 0)
.Select(GetDeviceInfo)
.ToList());
devices.ForEach(x => _logger.LogInformation($"[GetDevices] - Found Device: {x.Name}, DeviceId: {x.DeviceId}"));
}
catch (Exception ex)
{
devices.Add(new DeviceInfo("GPU0", 0, 0));
devices.Add(new DeviceInfo("GPU1", 1, 0));
_logger.LogError($"[GetDevices] - Failed to query devices, {ex.Message}");
}

_logger.LogInformation($"[GetDevices] - Query devices complete, Devices Found: {devices.Count}");
return devices;
}


/// <summary>
/// Gets the device information.
/// </summary>
/// <param name="adapter">The adapter.</param>
/// <returns></returns>
private static DeviceInfo GetDeviceInfo(AdapterInfo adapter)
{
string description;
unsafe
{
description = new string(adapter.Description);
}
var deviceId = (int)adapter.Id;
var vram = (int)(adapter.DedicatedVideoMemory / 1024 / 1024);
return new DeviceInfo(description, deviceId, vram);
}
}

public static partial class AdapterInterop
{
[LibraryImport("OnnxStack.Adapter.dll")]
[UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvCdecl) })]
public static partial int GetAdapter([MarshalAs(UnmanagedType.Bool)] bool preferHighPerformance);

[LibraryImport("OnnxStack.Adapter.dll")]
[UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvCdecl) })]
public static partial void GetAdapters(AdapterInfo[] adapterArray);
}

[StructLayout(LayoutKind.Sequential)]
public unsafe struct AdapterInfo
{
public uint Id;
public uint VendorId;
public uint DeviceId;
public uint SubSysId;
public uint Revision;
public ulong DedicatedVideoMemory;
public ulong DedicatedSystemMemory;
public ulong SharedSystemMemory;
public Luid AdapterLuid;
public fixed char Description[128];
}

[StructLayout(LayoutKind.Sequential)]
public struct Luid
{
public uint LowPart;
public int HighPart;
}
}
10 changes: 10 additions & 0 deletions OnnxStack.UI/Services/IDeviceService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System.Collections.Generic;
using OnnxStack.UI.Models;

namespace OnnxStack.UI.Services
{
public interface IDeviceService
{
IReadOnlyList<DeviceInfo> Devices { get; }
}
}
Loading