La dernière fois, j'ai vérifié le fonctionnement de VQE en utilisant blueqat. Cette fois, je vais essayer de résoudre le problème d'optimisation de la machine virtuelle (version simplifiée) avec VQE de blueqat.
En un mot, c'est un problème qui nécessite ** "Quel type d'arrangement est une machine virtuelle qui peut être raisonnablement intégrée dans une infrastructure virtuelle?" **. Je l'appelle actuellement ainsi, mais y a-t-il un nom officiel ...?
Mon travail quotidien consiste à utiliser les produits VMware pour fournir des machines virtuelles dans un environnement sur site et pour exploiter et maintenir l'ensemble de la plate-forme. La plate-forme est une plate-forme de taille moyenne d'environ 700 VM. Quand je suis en affaires, je pense: "N'est-il pas possible de libérer un peu plus de ressources (notamment CPU et mémoire) en concevant la disposition des machines virtuelles?
Je pense que chaque administrateur d'infrastructure est le même, mais en fournissant une nouvelle machine virtuelle, vous pouvez être particulièrement conscient de ce qui suit.
Cette perspective est très importante car la surcharge d'une seule machine physique peut affecter les performances de la machine virtuelle. De plus, en tant qu'administrateur de plate-forme, lorsque de nouvelles exigences pour la création d'une machine virtuelle apparaissent, c'est facile car vous n'avez qu'à vérifier la capacité restante de la plate-forme actuelle. Mais qu'en est-il des perspectives suivantes?
Penser le placement sous cet angle peut être une tâche ardue. Ce que l'on entend ici par «utiliser» est de savoir si les machines virtuelles peuvent être compactées et placées sans effort. Par conséquent, il est nécessaire de juger s'il est optimal dans son ensemble, y compris la machine virtuelle en cours d'exécution. Bien sûr, ce n'est pas le cas lorsque des fonctions de répartition de charge telles que DRS sont activées, mais d'après mon expérience, de nombreuses entreprises traditionnelles ne s'appuient pas sur ces fonctions et sont gérées par des humains. Et ces optimisations dans leur ensemble peuvent être envisagées non seulement pour l'administrateur de l'environnement sur site mais aussi pour l'opérateur cloud en remplaçant la machine virtuelle par une instance etc., ce qui est un élément très important pour la gestion des opérations d'une énorme infrastructure.
En supposant qu'il existe 1 000 machines virtuelles et 100 machines physiques, le nombre total de combinaisons sera de 100 000 (1 000 x 100). Eh bien, c'est tout à fait le cas avec les ordinateurs classiques, mais si vous devenez opérateur cloud, ce nombre ne suffira pas ...
Si vous emballez soudainement trop de choses, vous serez crevé, alors compliquez progressivement le problème. Cette fois, nous résoudrons le problème dans les conditions suivantes.
--Une machine physique
Je suis désolé d'imposer diverses conditions, mais laissez-moi continuer cette fois.
Considérez un état dans lequel une machine virtuelle avec les spécifications requises suivantes est installée sur une machine physique avec 6 cœurs de processeur (limite supérieure).
--VM0: 2 cœurs --VM1: 4 cœurs --VM2: 5 cœurs --VM3: 8 cœurs
Lorsqu'on ne considère pas le sur-engagement, quelle est la combinaison de machines virtuelles qui peut tirer le meilleur parti des performances des machines physiques? De plus, cette fois, nous ne placerons pas de machines virtuelles dépassant la limite supérieure du processeur (6 cœurs) des machines physiques. Dans le cas de cette configuration problématique, il est recommandé de ne placer que VM0 et VM2 (2 cœurs + 4 cœurs = 6 cœurs).
Cette fois hamiltonien est comme suit
H = -A\sum _{\alpha \in \rm{VM}}w_{\alpha}x_{\alpha} + B_{1}(W_{limit}-\sum _{\alpha \in \rm{VM}}w_{\alpha}x_{\alpha})^{2}
Il est exprimé par.
$ x_ {\ alpha} $ indique si la machine virtuelle $ \ alpha $ th sera installée sur la machine physique (1: installée, 0: non installée). Et $ W_ {\ rm {limit}} $ représente la limite CPU de la machine physique (6 cœurs dans ce cas), et $ w_ {\ alpha} $ représente la ressource CPU requise par la machine virtuelle $ \ alpha $ th. Je suis. De plus, $ A $ et $ B_1 $ sont des paramètres qui expriment le poids de chaque terme. Si vous le connaissez, ce problème est ** [Knapsack issue](https://ja.wikipedia.org/wiki/%E3%83%8A%E3%83%83%E3% Très similaire à 83% 97% E3% 82% B5% E3% 83% 83% E3% 82% AF% E5% 95% 8F% E9% A1% 8C) **. Cependant, contrairement au problème normal du sac à dos, la "valeur" et le "volume" sont les mêmes (CPU dans ce cas).
À cette époque, je voulais faire du développement simple avec IPad Pro, alors je l'ai exécuté avec Google Colaboratory.
Tout d'abord, installez blueqat. Non requis si vous utilisez un notebook Jupyter local et que vous l'avez déjà installé.
pip install blueqat
Importer la bibliothèque
from blueqat.pauli import qubo_bit as q
from blueqat.vqe import Vqe, QaoaAnsatz
import numpy as np
Classe de définition de machine virtuelle
class VirtualMachine():
def __init__(self, number, cost):
self.__number = number
self.__cost = cost
@property
def cost(self):
return self.__cost
Fonction de construction hamiltonienne
def create_Hamiltonian(CpuLimit, vms, params):
# first term of Hamiltonian
h1 = 0.0
for i in range(len(vms)):
h1 -= vms[i].cost * q(i)
# second term of Hamiltonian
h2 = 0.0
vmtotalCpu = 0.0
for j in range(len(vms)):
vmtotalCpu += vms[j].cost * q(j)
h2 = (CpuLimit - vmtotalCpu)**2
return params[0] * h1 + params[1] * h2
Traitement principal
#Physical Machine CPUlimit
CpuLimit = 6
#create Virtual Machine
vms = []
vms.append(VirtualMachine(number=0, cost=2))
vms.append(VirtualMachine(number=1, cost=4))
vms.append(VirtualMachine(number=2, cost=5))
vms.append(VirtualMachine(number=3, cost=8))
#Hyper Parameter(A=100)
Params =[1.0, 100.0]
#Create Hamiltonian
h = create_Hamiltonian(CpuLimit, vms, Params)
ansatz = QaoaAnsatz(h, 20)
runner = Vqe(ansatz)
result = runner.run()
print("mode:")
print(result.most_common(10))
mode:
(((1, 1, 0, 0), 0.7896332746515127), ((1, 0, 1, 0), 0.08187420835800963), ((0, 0, 1, 0), 0.0748323470871601), ((0, 1, 0, 0), 0.04708791984791466), ((0, 0, 0, 1), 0.005451806960418528), ((1, 0, 0, 1), 0.0005107132984061434), ((1, 1, 1, 0), 0.00015463766513252268), ((0, 1, 1, 0), 0.00014643503666132072), ((0, 0, 1, 1), 0.0001069655788835076), ((0, 0, 0, 0), 8.715493427846994e-05))
Quant à la lecture de la sortie, il s'agit de ((((combinaison de solutions 1, probabilité d'apparition de la combinaison 1), (combinaison de solutions 2, probabilité d'apparition de la combinaison 2), ...)). (L'ordre de sortie est l'ordre avec la probabilité d'apparition la plus élevée) (1,1,0,0) indique que VM0 et VM1 sont placés et que la probabilité d'apparition est de 78%. C'était un bon résultat. Cependant, en réalité, la probabilité d'occurrence d'une solution change à chaque fois qu'elle est exécutée, et la solution qui est la plus susceptible d'apparaître peut également fluctuer. Pourquoi···? Ce résultat d'exécution est exécuté environ 3 ou 4 fois et le meilleur est affiché. Si quelqu'un connaît la cause, faites-le moi savoir.
Ensuite, je voudrais optimiser lorsqu'il y a plusieurs machines physiques. Je me demande si je peux bien le faire
Recommended Posts