feat: register task by conditions
This commit is contained in:
parent
a6db247d35
commit
89c187748e
1
abi/Scheduler.abi
Normal file
1
abi/Scheduler.abi
Normal file
@ -0,0 +1 @@
|
||||
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"string","name":"dataImage","type":"string"},{"indexed":false,"internalType":"string","name":"trainImage","type":"string"}],"name":"StartRun","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"choose","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"clusters","outputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"},{"internalType":"bool","name":"available","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"clusterIndex","type":"uint256"}],"name":"getClusterInfo","outputs":[{"components":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"},{"internalType":"bool","name":"available","type":"bool"}],"internalType":"struct Scheduler.Cluster","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClusters","outputs":[{"components":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"},{"internalType":"bool","name":"available","type":"bool"}],"internalType":"struct Scheduler.Cluster[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfClusters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"}],"name":"registerCluster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"dataImage","type":"string"},{"internalType":"string","name":"trainImage","type":"string"},{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"}],"name":"registerTaskWithConditions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tasks","outputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"address","name":"client","type":"address"},{"internalType":"string","name":"dataImage","type":"string"},{"internalType":"string","name":"trainImage","type":"string"},{"internalType":"uint256","name":"status","type":"uint256"}],"stateMutability":"view","type":"function"}]
|
||||
@ -17,27 +17,47 @@ contract Scheduler {
|
||||
uint256 status;
|
||||
}
|
||||
|
||||
event StartRun(address provider, string dataImage, string trainImage);
|
||||
|
||||
uint256 private randomNumber;
|
||||
Cluster[] public clusters;
|
||||
Task[] public tasks;
|
||||
|
||||
function getRandomNumber() internal returns (uint256) {
|
||||
function _getRandomNumber() internal returns (uint256) {
|
||||
randomNumber = uint (keccak256(abi.encodePacked (msg.sender, block.timestamp, randomNumber)));
|
||||
return randomNumber;
|
||||
}
|
||||
|
||||
function registerCluster(uint256 gpuId, uint256 clusterSize) public {
|
||||
address provider = msg.sender;
|
||||
clusters.push(Cluster(provider, gpuId, clusterSize, false));
|
||||
clusters.push(Cluster(provider, gpuId, clusterSize, true));
|
||||
}
|
||||
|
||||
function registerTaskWithSpecificCluster(string memory dataImage, string memory trainImage, uint256 clusterIndex) public {
|
||||
function _registerTaskWithSpecificCluster(string memory dataImage, string memory trainImage, uint256 clusterIndex) internal {
|
||||
require(clusters[clusterIndex].available, "This GPU Cluster has been chosen");
|
||||
clusters[clusterIndex].available = false;
|
||||
|
||||
address provider = clusters[clusterIndex].provider;
|
||||
address client = msg.sender;
|
||||
tasks.push(Task(provider, client, dataImage, trainImage, 1));
|
||||
|
||||
emit StartRun(provider, dataImage, trainImage);
|
||||
}
|
||||
|
||||
function registerTaskWithConditions(string memory dataImage, string memory trainImage, uint256 gpuId, uint256 clusterSize) public {
|
||||
uint256[] memory suitable_clusters = new uint256[](clusters.length);
|
||||
uint256 index = 0;
|
||||
for (uint256 i=0; i<clusters.length; i++) {
|
||||
if (clusters[i].gpuId == gpuId && clusters[i].clusterSize == clusterSize && clusters[i].available) {
|
||||
suitable_clusters[index] = i;
|
||||
index += 1;
|
||||
}
|
||||
}
|
||||
require(index>0, "No suitable cluster.");
|
||||
|
||||
// random
|
||||
index = _getRandomNumber() % index;
|
||||
_registerTaskWithSpecificCluster(dataImage, trainImage, suitable_clusters[index]);
|
||||
}
|
||||
|
||||
function getNumberOfClusters() public view returns (uint256) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user