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

Commit 3c12247

Browse files
authored
Merge pull request #87 from saddam213/Device
DX Device Detection
2 parents fd5f4e8 + e70c90f commit 3c12247

13 files changed

+400
-86
lines changed

OnnxStack.UI/App.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public App()
4141
builder.Services.AddTransient<UpdateUpscaleModelDialog>();
4242
builder.Services.AddSingleton<IModelFactory, ModelFactory>();
4343
builder.Services.AddSingleton<IDialogService, DialogService>();
44-
44+
builder.Services.AddSingleton<IDeviceService, DeviceService>();
4545
// Build App
4646
_applicationHost = builder.Build();
4747
}

OnnxStack.UI/Dialogs/UpdateModelDialog.xaml

Lines changed: 38 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
xmlns:userControls="clr-namespace:OnnxStack.UI.UserControls"
88
mc:Ignorable="d"
99
Name="UI"
10+
MinWidth="1200"
11+
MaxWidth="1200"
1012
Icon="/Images/Icon.png"
1113
SizeToContent="WidthAndHeight"
1214
WindowStartupLocation="CenterOwner"
@@ -27,16 +29,16 @@
2729

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

30-
<StackPanel Margin="0,0,4,0">
32+
<StackPanel>
3133
<TextBlock Text="Pipeline" />
3234
<ComboBox ItemsSource="{Binding Source={StaticResource DiffuserPipelineType}}" SelectedItem="{Binding UpdateModelSet.PipelineType}" />
3335
</StackPanel>
3436

35-
<StackPanel Margin="0,0,4,0">
37+
<StackPanel Margin="4,0">
3638
<TextBlock Text="Model Type" />
3739
<ComboBox ItemsSource="{Binding Source={StaticResource ModelType}}" SelectedItem="{Binding UpdateModelSet.ModelType}" />
3840
</StackPanel>
39-
<StackPanel Margin="0,0,4,0">
41+
<StackPanel >
4042
<TextBlock Text="Sample Size" />
4143
<TextBox Text="{Binding UpdateModelSet.SampleSize}" />
4244
</StackPanel>
@@ -53,40 +55,35 @@
5355
</GroupBox>
5456

5557
<GroupBox Header="Performance" Margin="5,0" >
56-
<UniformGrid Columns="2" Margin="5">
57-
58-
<StackPanel Margin="0,0,4,0">
59-
<TextBlock Text="Execution Provider" />
60-
<ComboBox ItemsSource="{Binding UISettings.SupportedExecutionProviders}" SelectedItem="{Binding UpdateModelSet.ExecutionProvider}" />
58+
<StackPanel Margin="5">
59+
<StackPanel Margin="0,0,4,0">
60+
<TextBlock Text="Device" />
61+
<userControls:DevicePickerControl
62+
UISettings="{Binding UISettings}"
63+
DeviceId="{Binding UpdateModelSet.DeviceId, Mode=TwoWay}"
64+
ExecutionProvider="{Binding UpdateModelSet.ExecutionProvider, Mode=TwoWay}" />
6165
</StackPanel>
62-
<TextBlock />
63-
<StackPanel Margin="0,0,4,0">
66+
<StackPanel Margin="0,4,0,0">
6467
<TextBlock Text="Mode" />
6568
<ComboBox ItemsSource="{Binding Source={StaticResource ExecutionModeType}}" SelectedItem="{Binding UpdateModelSet.ExecutionMode}" />
6669
</StackPanel>
67-
<StackPanel Margin="0,0,4,0">
68-
<DockPanel>
69-
<TextBlock DockPanel.Dock="Left" Text="DeviceId" />
70-
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
71-
</DockPanel>
72-
<TextBox Text="{Binding UpdateModelSet.DeviceId}" />
73-
</StackPanel>
74-
<StackPanel Margin="0,0,4,0">
75-
<DockPanel>
76-
<TextBlock DockPanel.Dock="Left" Text="InterOp Threads" />
77-
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
78-
</DockPanel>
79-
<TextBox Text="{Binding UpdateModelSet.InterOpNumThreads}" />
80-
</StackPanel>
81-
82-
<StackPanel>
83-
<DockPanel>
84-
<TextBlock DockPanel.Dock="Left" Text="IntraOp Threads" />
85-
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
86-
</DockPanel>
87-
<TextBox Text="{Binding UpdateModelSet.IntraOpNumThreads}" />
88-
</StackPanel>
89-
</UniformGrid>
70+
<UniformGrid Columns="2" Margin="0,4,0,0">
71+
<StackPanel Margin="0,0,2,0">
72+
<DockPanel>
73+
<TextBlock DockPanel.Dock="Left" Text="InterOp Threads" />
74+
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
75+
</DockPanel>
76+
<TextBox Text="{Binding UpdateModelSet.InterOpNumThreads}" />
77+
</StackPanel>
78+
<StackPanel Margin="2,0,0,0">
79+
<DockPanel>
80+
<TextBlock DockPanel.Dock="Left" Text="IntraOp Threads" />
81+
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
82+
</DockPanel>
83+
<TextBox Text="{Binding UpdateModelSet.IntraOpNumThreads}" />
84+
</StackPanel>
85+
</UniformGrid>
86+
</StackPanel>
9087
</GroupBox>
9188

9289
<GroupBox Header="Advanced Settings" >
@@ -148,22 +145,20 @@
148145
</DockPanel>
149146

150147
<!--Override Defaults-->
151-
<UniformGrid Grid.Column="0" Columns="5" Visibility="{Binding IsOverrideEnabled, Converter={StaticResource BooleanToVisibilityConverter}}" Margin="0,5,0,10">
148+
<UniformGrid Grid.Column="0" Columns="4" Visibility="{Binding IsOverrideEnabled, Converter={StaticResource BooleanToVisibilityConverter}}" Margin="0,5,0,10">
152149
<StackPanel Margin="0,0,4,0">
153-
<TextBlock Text="Provider" />
154-
<ComboBox ItemsSource="{Binding UISettings.SupportedExecutionProviders, ElementName=UI}" SelectedItem="{Binding ExecutionProvider}" />
150+
<TextBlock Text="Device" />
151+
<userControls:DevicePickerControl
152+
UISettings="{Binding UISettings, ElementName=UI}"
153+
DeviceId="{Binding DeviceId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
154+
ExecutionProvider="{Binding ExecutionProvider, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
155155
</StackPanel>
156+
156157
<StackPanel Margin="0,0,4,0">
157158
<TextBlock Text="Mode" />
158159
<ComboBox ItemsSource="{Binding Source={StaticResource ExecutionModeType}}" SelectedItem="{Binding ExecutionMode}" />
159160
</StackPanel>
160-
<StackPanel Margin="0,0,4,0">
161-
<DockPanel>
162-
<TextBlock DockPanel.Dock="Left" Text="DeviceId" />
163-
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
164-
</DockPanel>
165-
<TextBox Text="{Binding DeviceId, TargetNullValue=''}" />
166-
</StackPanel>
161+
167162
<StackPanel Margin="0,0,4,0">
168163
<DockPanel>
169164
<TextBlock DockPanel.Dock="Left" Text="InterOp Threads" />

OnnxStack.UI/Dialogs/UpdateUpscaleModelDialog.xaml

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,22 +74,20 @@
7474
<GroupBox Header="Performance" Margin="5,10,5,0" >
7575
<UniformGrid Columns="2" Margin="5">
7676

77-
<StackPanel Margin="0,0,4,0">
78-
<TextBlock Text="Execution Provider" />
79-
<ComboBox ItemsSource="{Binding UISettings.SupportedExecutionProviders}" SelectedItem="{Binding UpdateModelSet.ExecutionProvider}" />
77+
<StackPanel Margin="0,0,4,0">
78+
<TextBlock Text="Device" />
79+
<userControls:DevicePickerControl
80+
UISettings="{Binding UISettings}"
81+
DeviceId="{Binding UpdateModelSet.DeviceId, Mode=TwoWay}"
82+
ExecutionProvider="{Binding UpdateModelSet.ExecutionProvider, Mode=TwoWay}" />
8083
</StackPanel>
84+
8185
<TextBlock />
8286
<StackPanel Margin="0,0,4,0">
8387
<TextBlock Text="Mode" />
8488
<ComboBox ItemsSource="{Binding Source={StaticResource ExecutionModeType}}" SelectedItem="{Binding UpdateModelSet.ExecutionMode}" />
8589
</StackPanel>
86-
<StackPanel>
87-
<DockPanel>
88-
<TextBlock DockPanel.Dock="Left" Text="DeviceId" />
89-
<TextBlock Text="(0=auto)" FontSize="9" FontStyle="Italic" Margin="6,0,6,0" Opacity="0.5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
90-
</DockPanel>
91-
<TextBox Text="{Binding UpdateModelSet.DeviceId}" />
92-
</StackPanel>
90+
9391
<StackPanel Margin="0,0,4,0">
9492
<DockPanel>
9593
<TextBlock DockPanel.Dock="Left" Text="InterOp Threads" />

OnnxStack.UI/Models/DeviceInfo.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
namespace OnnxStack.UI.Models
2+
{
3+
public class DeviceInfo
4+
{
5+
public DeviceInfo(string name, int deviceId, int vram)
6+
{
7+
Name = name;
8+
DeviceId = deviceId;
9+
VRAM = vram;
10+
}
11+
12+
public string Name { get; set; }
13+
public int DeviceId { get; set; }
14+
public int VRAM { get; set; }
15+
}
16+
}

OnnxStack.UI/Models/OnnxStackUIConfig.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,27 @@ public class OnnxStackUIConfig : IConfigSection
1414
public int DefaultIntraOpNumThreads { get; set; }
1515
public ExecutionMode DefaultExecutionMode { get; set; }
1616
public ExecutionProvider DefaultExecutionProvider { get; set; }
17-
public IEnumerable<ExecutionProvider> SupportedExecutionProviders => GetSupportedExecutionProviders();
17+
public ExecutionProvider SupportedExecutionProvider => GetSupportedExecutionProvider();
1818
public ObservableCollection<UpscaleModelSetViewModel> UpscaleModelSets { get; set; } = new ObservableCollection<UpscaleModelSetViewModel>();
1919
public ObservableCollection<StableDiffusionModelSetViewModel> StableDiffusionModelSets { get; set; } = new ObservableCollection<StableDiffusionModelSetViewModel>();
2020

2121

22-
public IEnumerable<ExecutionProvider> GetSupportedExecutionProviders()
22+
public ExecutionProvider GetSupportedExecutionProvider()
2323
{
2424
#if DEBUG_CUDA || RELEASE_CUDA
25-
yield return ExecutionProvider.Cuda;
25+
return ExecutionProvider.Cuda;
2626
#elif DEBUG_TENSORRT || RELEASE_TENSORRT
27-
yield return ExecutionProvider.TensorRT;
27+
return ExecutionProvider.TensorRT;
2828
#else
29-
yield return ExecutionProvider.DirectML;
29+
return ExecutionProvider.DirectML;
3030
#endif
31-
yield return ExecutionProvider.Cpu;
3231
}
3332

3433
public void Initialize()
3534
{
36-
DefaultExecutionProvider = SupportedExecutionProviders.Contains(DefaultExecutionProvider)
35+
DefaultExecutionProvider = DefaultExecutionProvider == SupportedExecutionProvider || DefaultExecutionProvider == ExecutionProvider.Cpu
3736
? DefaultExecutionProvider
38-
: SupportedExecutionProviders.First();
37+
: SupportedExecutionProvider;
3938
}
4039

4140
}

OnnxStack.UI/OnnxStack.Adapter.dll

89.5 KB
Binary file not shown.

OnnxStack.UI/OnnxStack.UI.csproj

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<PlatformTarget>x64</PlatformTarget>
1111
<Configurations>Debug;Release;Debug-Cuda;Debug-TensorRT;Release-Cuda;Release-TensorRT</Configurations>
1212
<Platforms>x64</Platforms>
13+
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
1314
</PropertyGroup>
1415

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

72+
<ItemGroup>
73+
<None Update="OnnxStack.Adapter.dll">
74+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
75+
</None>
76+
</ItemGroup>
77+
7278
</Project>
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
using Microsoft.Extensions.Logging;
2+
using OnnxStack.UI.Models;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Runtime.CompilerServices;
7+
using System.Runtime.InteropServices;
8+
9+
namespace OnnxStack.UI.Services
10+
{
11+
public class DeviceService : IDeviceService
12+
{
13+
private readonly ILogger<DeviceService> _logger;
14+
private IReadOnlyList<DeviceInfo> _devices;
15+
16+
/// <summary>
17+
/// Initializes a new instance of the <see cref="DeviceService"/> class.
18+
/// </summary>
19+
/// <param name="logger">The logger.</param>
20+
public DeviceService(ILogger<DeviceService> logger)
21+
{
22+
_logger = logger;
23+
_devices = GetDevices();
24+
}
25+
26+
/// <summary>
27+
/// Gets the devices.
28+
/// </summary>
29+
public IReadOnlyList<DeviceInfo> Devices => _devices;
30+
31+
32+
/// <summary>
33+
/// Gets the devices.
34+
/// </summary>
35+
/// <returns></returns>
36+
private IReadOnlyList<DeviceInfo> GetDevices()
37+
{
38+
_logger.LogInformation("[GetDevices] - Query Devices...");
39+
var devices = new List<DeviceInfo> { new DeviceInfo("CPU", 0, 0) };
40+
41+
try
42+
{
43+
var adapters = new AdapterInfo[10];
44+
AdapterInterop.GetAdapters(adapters);
45+
devices.AddRange(adapters
46+
.Where(x => x.DedicatedVideoMemory > 0)
47+
.Select(GetDeviceInfo)
48+
.ToList());
49+
devices.ForEach(x => _logger.LogInformation($"[GetDevices] - Found Device: {x.Name}, DeviceId: {x.DeviceId}"));
50+
}
51+
catch (Exception ex)
52+
{
53+
devices.Add(new DeviceInfo("GPU0", 0, 0));
54+
devices.Add(new DeviceInfo("GPU1", 1, 0));
55+
_logger.LogError($"[GetDevices] - Failed to query devices, {ex.Message}");
56+
}
57+
58+
_logger.LogInformation($"[GetDevices] - Query devices complete, Devices Found: {devices.Count}");
59+
return devices;
60+
}
61+
62+
63+
/// <summary>
64+
/// Gets the device information.
65+
/// </summary>
66+
/// <param name="adapter">The adapter.</param>
67+
/// <returns></returns>
68+
private static DeviceInfo GetDeviceInfo(AdapterInfo adapter)
69+
{
70+
string description;
71+
unsafe
72+
{
73+
description = new string(adapter.Description);
74+
}
75+
var deviceId = (int)adapter.Id;
76+
var vram = (int)(adapter.DedicatedVideoMemory / 1024 / 1024);
77+
return new DeviceInfo(description, deviceId, vram);
78+
}
79+
}
80+
81+
public static partial class AdapterInterop
82+
{
83+
[LibraryImport("OnnxStack.Adapter.dll")]
84+
[UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvCdecl) })]
85+
public static partial int GetAdapter([MarshalAs(UnmanagedType.Bool)] bool preferHighPerformance);
86+
87+
[LibraryImport("OnnxStack.Adapter.dll")]
88+
[UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvCdecl) })]
89+
public static partial void GetAdapters(AdapterInfo[] adapterArray);
90+
}
91+
92+
[StructLayout(LayoutKind.Sequential)]
93+
public unsafe struct AdapterInfo
94+
{
95+
public uint Id;
96+
public uint VendorId;
97+
public uint DeviceId;
98+
public uint SubSysId;
99+
public uint Revision;
100+
public ulong DedicatedVideoMemory;
101+
public ulong DedicatedSystemMemory;
102+
public ulong SharedSystemMemory;
103+
public Luid AdapterLuid;
104+
public fixed char Description[128];
105+
}
106+
107+
[StructLayout(LayoutKind.Sequential)]
108+
public struct Luid
109+
{
110+
public uint LowPart;
111+
public int HighPart;
112+
}
113+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System.Collections.Generic;
2+
using OnnxStack.UI.Models;
3+
4+
namespace OnnxStack.UI.Services
5+
{
6+
public interface IDeviceService
7+
{
8+
IReadOnlyList<DeviceInfo> Devices { get; }
9+
}
10+
}

0 commit comments

Comments
 (0)