遠端轉譯工作階段

在 Azure 遠端轉譯 (ARR) 中,「工作階段」是很重要的概念。 本文會說明工作階段到底是什麼。

概觀

Azure 遠端轉譯的運作方式,是將複雜的轉譯工作交由雲端處理。 這類轉譯工作並非任何伺服器都能完成,因為大多數雲端伺服器都沒有 GPU。 由於牽涉到的資料量龐大,在互動畫面播放速率下產生結果的需求又相當嚴苛,由哪台伺服器處理哪個使用者要求的責任也無法在作業途中交由另台機器,不像較為常見的 web 流量能如此處理。

這表示當您使用 Azure 遠端轉譯時,必須以獨佔方式保留具有必要硬體功能的雲端伺服器,以供處理轉譯要求。 「工作階段」指的是與此伺服器互動所涉及的所有內容。 從保留 (租用) 機器供您使用的初始要求開始,再到模型載入和操作的所有命令,到釋出雲端伺服器的租用為止。

管理工作階段

有許多種方式可以管理工作階段並與之互動。 若要以不受程式設計語言影響的方式來建立、更新和關閉工作階段,可透過工作階段管理 REST API。 在 C# 和 C++ 中,這類作業會透過類別 RemoteRenderingClientRenderingSession 公開。 至於 Unity 應用程式,ARRServiceUnity 元件會提供進一步的公用程式函式。

「連線」至作用中的工作階段之後,載入模型和與場景互動的作業,就會透過 RenderingSession 類別公開。

同時管理多個工作階段

您無法從一台裝置完全「連線」到多個工作階段。 不過,您可以隨意從單一應用程式建立、觀察和關閉多個工作階段。 只要應用程式並不打算與工作階段連線,就不需要在 HoloLens 2 這類裝置上執行。 在想要透過中央機制控制工作階段的情況下,可能就會產生這類實作的使用案例。 例如,您可以組建一個 Web 應用程式,讓多台平板電腦和 HoloLens 裝置能夠登入。 然後,此應用程式可以在平板電腦上顯示選項,例如要顯示的 CAD 型號。 如果使用者進行選取,系統會將這項資訊傳達給所有 HoloLens 裝置,以建立起共享體驗。

工作階段的各個階段

每個工作階段都會經歷多個階段。

工作階段啟動

當您要求 ARR 建立新的工作階段時,首先會傳回工作階段的 UUID。 此 UUID 可用來查詢工作階段的相關資訊。 UUID 和工作階段的一些基本資訊會保存 30 天,因此即使在工作階段停止後,仍可查詢此一資訊。 此時,工作階段狀態會回報為啟動

接下來,Azure 遠端轉譯會嘗試尋找可裝載工作階段的伺服器。 這種搜尋作業有兩種決定因素。 第一種是只會在您的區域中保留伺服器。 這是因為跨區域的網路延遲可能過高,無法保證良好的體驗。 第二個因素在於您指定的所需「大小」。 在每個區域中,可以滿足標準進階大小要求的伺服器數量有限。 因此如果區域中符合所要求大小的伺服器全都在使用中,工作階段就會建立失敗。 您可以查詢失敗的原因。

重要

如果您要求的是「標準」伺服器大小,而此要求因為目前需求過多而失敗,並不表示要求「進階」伺服器時也會失敗。 因此如果對您來說這是可用的選項,則可嘗試回到「進階」伺服器大小。

當服務找到合適的伺服器時,就需要將適當的虛擬機器 (VM) 複製到伺服器上,將其轉換成 Azure 遠端轉譯主機。 這個程序需要幾分鐘的時間。 之後,VM 會開機,且工作階段狀態會轉換成就緒

此時伺服器已在獨佔狀態,只會等待您的輸入。 這也是您開始支付服務費用的時間點。

連線到工作階段

工作階段狀態為「就緒」之後,您就可以「連線」到工作階段。 連線後,裝置可以傳送命令來載入和修改模型。 每個 ARR 主機一次只能服務一台用戶端裝置,因此當用戶端連線到工作階段時,會對轉譯內容具有獨佔控制權。 這也表示,轉譯效能永遠不會因控制範圍外的原因而有所差異。

重要

雖然只有一個用戶端可以「連線」至工作階段,但查詢工作階段的相關基本資訊 (例如目前狀態) 則不需連線。

當有一台裝置連線到工作階段時,其他裝置的連線嘗試會失敗。 不過,一旦連線的裝置中斷連線 (不論是主動斷線或是某種類行的失敗),工作階段就會接受另一個連線要求。 如此會捨棄所有先前的狀態 (載入的模型等),讓下一個連線裝置取得原始狀態的工作階段。 因此,您可以透過不同的裝置重複使用工作階段數次,而且在大部分情況下,可能可以隱藏終端使用者的工作階段啟動額外負荷。

重要

遠端伺服器永遠不會改變用戶端資料的狀態。 所有資料變動 (例如轉換更新和載入要求) 都必須由用戶端應用程式執行。 所有動作都會立即於用戶端狀態上更新。

工作階段結束

當您要求新的工作階段時,可指定「租用時間上限」,範圍通常是在一到八個小時內。 這是主機會接受您輸入的持續時間。

工作階段結束的一般原因有兩個。 即是您手動要求停止工作階段,或超過租用時間上限。 在這兩種情況下,主機任何作用中的連線都會立即關閉,而該伺服器上的服務也會關閉。 接著,伺服器會回到 Azure 集區,且可能會因其他目的受到徵用。 您無法復原或取消工作階段的停止作業。 查詢已停止工作階段的工作階段狀態時,將會根據是遭到手動關閉還是已達到租用時間上限,傳回已停止已過期

工作階段可能也會因為某些失敗而停止。

不論任何情況,一旦停止工作階段,即不會再向您收費。

警告

不論是否連線到工作階段,也不論時間長短,都不會影響帳單。 您支付的服務費用取決於「工作階段持續時間」,即是您獨佔伺服器的保留時間,以及所要求的硬體功能 (配置大小)。 如果您啟動了工作階段並連線 5 分鐘,之後沒有停止工作階段,並持續執行直到租用到期為止,則需支付完整的工作階段租用時間費用。 相反地,「租用時間上限」基本算是一種防護機制。 如果您啟動工作階段後再手動停止,即使您申請的了 8 小時的工作階段租用時間,然後只使用了 5 分鐘,也是如此。

延長工作階段的租用時間

如果您發現需要更多時間,也可以將作用中的工作階段延長租用時間

程式碼範例

下列程式碼是啟動工作階段的簡單實作範例,等待「就緒」狀態、連線,然後再中斷連線並再次關閉。

RemoteRenderingInitialization init = new RemoteRenderingInitialization();
// fill out RemoteRenderingInitialization parameters...

RemoteManagerStatic.StartupRemoteRendering(init);

SessionConfiguration sessionConfig = new SessionConfiguration();
// fill out sessionConfig details...

RemoteRenderingClient client = new RemoteRenderingClient(sessionConfig);

RenderingSessionCreationOptions rendererOptions = new RenderingSessionCreationOptions();
// fill out rendererOptions...

CreateRenderingSessionResult result = await client.CreateNewRenderingSessionAsync(rendererOptions);

RenderingSession session = result.Session;
RenderingSessionProperties sessionProperties;
while (true)
{
    var propertiesResult = await session.GetPropertiesAsync();
    sessionProperties = propertiesResult.SessionProperties;
    if (sessionProperties.Status != RenderingSessionStatus.Starting &&
        sessionProperties.Status != RenderingSessionStatus.Unknown)
    {
        break;
    }
    // REST calls must not be issued too frequently, otherwise the server returns failure code 429 ("too many requests"). So we insert the recommended delay of 10s
    await Task.Delay(TimeSpan.FromSeconds(10));
}

if (sessionProperties.Status != RenderingSessionStatus.Ready)
{
    // Do some error handling and either terminate or retry.
}

// Connect to server
ConnectionStatus connectStatus = await session.ConnectAsync(new RendererInitOptions());

// Connected!

while (...)
{
    // per frame update

    session.Connection.Update();
}

// Disconnect
session.Disconnect();

// stop the session
await session.StopAsync();

// shut down the remote rendering SDK
RemoteManagerStatic.ShutdownRemoteRendering();

您可以透過程式碼維護、操作並查詢多個 RemoteRenderingClientRenderingSession 執行個體。 但是每次只有一台裝置能連線至 RenderingSession

虛擬機器的存留期未繫結至 RemoteRenderingClient 執行個體或 RenderingSession 執行個體。 必須呼叫 RenderingSession.StopAsync 以停止工作階段。

您可以透過 RenderingSession.SessionUuid() 來查詢存留的工作階段識別碼,並在本機快取處理。 透過此識別碼,應用程式可以呼叫 RemoteRenderingClient.OpenRenderingSessionAsync 以繫結至該工作階段。

RenderingSession.IsConnected 為 True 時,RenderingSession.Connection 會傳回 RenderingConnection的執行個體,其中包含可載入模型、操作實體查詢資訊 (轉譯場景相關資訊) 的函式。

API 文件

下一步