Running Stable Diffusion Image Generation on AMD GPU & Windows

AI image generation has been making a lot of buzz lately. It’s an exciting space due to the systems like DALL·E and Midjourney becoming available for people outside the AI world to play with. However, the one I find compelling, from a tech nerd viewpoint, is Stable Diffusion because it is open source and can run on local hardware. So, of course, I have to try it out and see how it worked. 

Getting Stable Diffusion running on my hardware is more complicated than at first glance. Out of the box, the project is designed to run on the PyTorch machine learning framework. That’s a problem for me because PyTorch only supports hardware acceleration on Windows using NVIDIA’s CUDA API. And I have an AMD GPU. Linux has a better chance of success because PyTorch supports AMD’s ROCm API, but that’s a project for another day. There is another option.

Continue reading “Running Stable Diffusion Image Generation on AMD GPU & Windows”

Running Stable Diffusion Image Generation on Your CPU

AI image generation has been making a lot of buzz lately. It’s an exciting space due to the systems like DALL·E and Midjourney becoming available for people outside the AI world to play with. However, the one I find compelling, from a tech nerd viewpoint, is Stable Diffusion because it is open source and can run on local hardware. So, of course, I have to try it out and see how it worked. 

Getting Stable Diffusion running on my hardware is more complicated than at first glance. Out of the box, the project is designed to run on the PyTorch machine learning framework. That can be a problem because PyTorch only supports hardware acceleration using NVIDIA’s CUDA API, AMD’s ROCM API, or Apple’s Metal API (using MPS). What if you don’t have a system supported by those APIs, like most laptops? There is another option.

Continue reading “Running Stable Diffusion Image Generation on Your CPU”

Plex+Docker+Synology=❤

This post is either a cool idea or ridiculous. Having received a Synology DS220+ NAS over the winter, I decided to dive in to see how much stuff I could run on the system. Previously I used an old Ubuntu PC as a storage/print server, Plex server, and other various things. The system filled my needs as a home server for several years, but eventually, I ran out of storage space and needed to decide on the next stage of my home sever life.

All of this got me thinking about Docker. It’s not a technology I got to use a work, but software containerization is something I felt I’ll need to be familiar with going forward. With that decided, I dove into learning Docker and rolling out Plex on the Synology.

Continue reading “Plex+Docker+Synology=❤”

The Compaq Support Software CD for Compaq Portable Products

While looking through spindles of software, I rediscovered an old CD called the Compaq Support Software CD for Compaq Portable Products. This disc was a fantastic CD to have in the 1990-2000s when my Internet connection was a 28K dial-up service. It contained drivers, utilities, firmware, and more for Compaq’s 90s laptops in an easy-to-use web browser interface. Several members of my family and I had LTE 5000 series laptops and used the CD to reload drivers and software after OS installs.

The Support Software CD is not as important as back in the 90s. But people in the retro PC community are always searching for computer restore or driver CDs. In addition, some hardware isn’t usable without the software contained on those discs. To do my part, I have created an ISO image of the CD and uploaded it to Archive.org. My hope is it will be preserved long after I’ve forgotten about the Compaq LTE laptops and associated CDs.

Have fun,
Tony

https://archive.org/details/compaq-support-software-cd-for-compaq-portable-products-v-98.07

Microsoft Endpoint Manager: A LouMug Presentation

This past November, I got the opportunity to present at the Louisville Microsoft Users Group. The topic this time was Microsoft Endpoint Manager, where I discussed the components of Endpoint Manager and how we are using the platform at work. The interaction from the audience was fantastic, with several people asking great questions and giving comments. A recording of the talk has been uploaded to YouTube for anyone who wants to watch. The slide deck is also available below, with embedded links to several resources.

Have fun,
Tony

Microsoft has Mixed GPOs into their Device Profiles

Microsoft is about to make Windows 10 device configurations in Endpoint Manager/Intune way more powerful. While digging through Microsoft’s documentation about Windows MDM, I noticed a new list of CSP policies prefixed with “ADMX_”. GitHub commits indicate the documentation of these policies didn’t exist until late last year. That wouldn’t be much to talk about, except these new policies match Windows’ built-in group policies.

Take a moment to let that statement sink in. One of the biggest frustrations I’ve run into with Intune device profiles has been the lack of parity with group policies. Some settings, like configuring screensavers to be secure, aren’t available in Windows’ MDM. The only way I’ve managed to work around these device policy limitations has been to use PowerShell scripts.

The ADMX backed policies’ documentation all say they are available in the “latest Windows 10 Insider Preview Build”. And finally, Microsoft released the first Windows Insider Preview Build for 2021, which included the needed functionality. As it stands right now, the process of using the new ADMX backed policies isn’t easy. It requires creating custom device profiles, knowing the correct OMA-URI, and how to format the data. Getting the correct format involves looking at the corresponding .admx file built into Windows. My hope is Microsoft will add all of these policies to the “Administrative Template” based device profiles quickly. Some already exist, but it is a fraction of the settings available in GPOs.

I hope to share more info on using ADMX backed policies as Windows 10 21H1 becomes available.

As always, have fun
-Tony

Remove SCCM Old Computer Objects Based on SIDs

There are dozens of blog posts and instructions on how to remove computer objects from Configuration if the corresponding AD object no longer exists. I thought I would put my own spin on the idea since I haven’t seen it before. Many of the guides rely on matching the object’s names to each other. The problem you can run into with this method is reusing computer names. You can delete a computer in AD and add a new one with the same computer name. When Configuration Manager runs its next AD sync it will find the new AD computer object and add it to the inventory. Now Configuration Manager has two computer objects with the same name. As an administrator this can get confusing and if you try to clean up Configuration Manager based on name matching the old object won’t get removed.

Rather than match the objects on name you can use something more unique, like the SID. Configuration Manager capture the AD objects SID during the sync so you can use that to match objects and delete those that no longer exist. You can look at the code below or in github.

Find the PowerShell script at https://github.com/agizmo/SCCM_Computer_Removal_SID

$SiteCode = "<YOUR SITE CODE>" # Site code
$ProviderMachineName = "<YOUR CM SERVER>" # SMS Provider machine name

#Customizations
$initParams = @{}

#Import the ConfigurationManager.psd1 module
if((Get-Module ConfigurationManager) -eq $null) {
Import-Module "$($ENV:SMS_ADMIN_UI_PATH)..\ConfigurationManager.psd1" @initParams
}

#Connect to the site's drive if it is not already present
if((Get-PSDrive -Name $SiteCode -PSProvider CMSite -ErrorAction SilentlyContinue) -eq $null) {
New-PSDrive -Name $SiteCode -PSProvider CMSite -Root $ProviderMachineName @initParams
}

#Set the current location to be the site code.
Set-Location "$($SiteCode):\" @initParams

#As far as I can tell, this is the only way to get the SID for a computer object in SCCM. The prebuilt cmdlets will not return SID
$devices = Get-WmiObject -ComputerName $ProviderMachineName -Namespace "ROOT\SMS\Site_$SiteCode" -Class SMS_R_System
foreach ($device in $devices) {
try {
$sid = new-object System.Security.Principal.SecurityIdentifier($device.SID)
} catch {}
$ADcomputer = Get-ADComputer -Filter {SID -eq $sid} if ($ADcomputer) { #nothing } else { Remove-CMResource -ResourceId $device.ResourceId -Force } Remove-Variable sid Remove-Variable ADcomputer
}

Simple as that. Hope you found this article helpful. And play around with PowerShell. There is near infinite capabilities of the language.

Have fun.
-Tony